none
Consulta SQL RRS feed

  • Pergunta

  • Boa tarde. 

    Eu desenvolvi um select para retornar o valor do custo de produtos de determinados status. 

    select IT.filial, 
    case when p.status = '01' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 01',
    case when p.status = '02' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 02'
    from ITEMFILEST it inner join
         PRODUTOCAD p on p.codpro = it.codpro
    where it.filial not in ('','07','61','18')
    and it.quant > 0

    group by p.status, it.filial
    having p.status in('01','02')
    order by it.filial
         

    Porém, estou com 2 problemas:

    - O primeiro é que não estou conseguindo agrupar o resultado em uma linha; 

    - o segundo é que preciso de uma quarta coluna com a soma das colunas Valor Status 01 + Valor Status 02.

    Sou iniciante no fórum... obrigado pelo auxílio.

    quinta-feira, 20 de setembro de 2012 19:10

Respostas

  • Acho que consegui simular:

    Declare @PRODUTOCAD Table (codpro int, precocomp Decimal(12,5), Status Char(02))
    Declare @ITEMFILEST Table (filial int, codpro int, quant int)
    
    Insert Into @PRODUTOCAD Values (10, 15.50, '01'), (20, 18.00, '01'), (30, 22.35, '02'), (40, 26.70, '03')
    Insert Into @ITEMFILEST Values (1, 10, 5), (2, 10, 8), (1, 20, 10), (1, 30, 10), (1, 40, 12) 
    
    ;With CTE as
    (
    select
      IT.filial,
      P.status,
      case when p.status = '01' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 01',
      case when p.status = '02' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 02'
    from
      @ITEMFILEST it inner join @PRODUTOCAD p on p.codpro = it.codpro
    where
      it.filial not in ('','07','61','18')
      and it.quant > 0
      and p.status in('01','02')
    group by
      p.status, it.filial
    )
    Select
      filial,
      [Valor Status 01] = Sum([Valor Status 01]),
      [Valor Status 02] = Sum([Valor Status 02])
    From
      CTE
    Group by
      filial


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 14:25
    Moderador
  • Veja se é isso:

    Declare @PRODUTOCAD Table (codpro int, precocomp Decimal(12,5), Status Char(02))
    Declare @ITEMFILEST Table (filial int, codpro int, quant int)
    
    Insert Into @PRODUTOCAD Values (10, 15.50, '01'), (20, 18.00, '01'), (30, 22.35, '02'), (40, 26.70, '03')
    Insert Into @ITEMFILEST Values (1, 10, 5), (2, 10, 8), (1, 20, 10), (1, 30, 10), (1, 40, 12) 
    
    ;With CTE as
    (
    select
      IT.filial,
      P.status,
      case when p.status = '01' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 01',
      case when p.status = '02' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 02',
      cast(sum(it.quant * p.precocomp) as numeric (15,2)) as  'TOTAL'
    from
      @ITEMFILEST it inner join @PRODUTOCAD p on p.codpro = it.codpro
    where
      it.filial not in ('','07','61','18')
      and it.quant > 0
      and p.status in('01','02')
    group by
      p.status, it.filial
    )
    Select
      filial,
      [Valor Status 01] = Sum([Valor Status 01]),
      [Valor Status 02] = Sum([Valor Status 02]),
      [TOTAL] = SUM([TOTAL]),
      [Percentual Status 01] = Case When SUM([TOTAL]) > 0 Then (Sum([Valor Status 01] * 100) / SUM([TOTAL])) Else 0 End,
      [Percentual Status 02] = Case When SUM([TOTAL]) > 0 Then (Sum([Valor Status 02] * 100) / SUM([TOTAL])) Else 0 End
    From
      CTE
    Group by
      filial


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 17:42
    Moderador

Todas as Respostas

  • Boa tarde Cesar ! O primeiro problema é que voce esta agrupando mais colunas do que o seu select tem, voce não agrupa campos de somatoria, teria que agrupar somente o IT.filial, tente a query abaixo que deve funcionar para os 2 casos: select IT.filial, case when p.status = '01' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 01', case when p.status = '02' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 02', case when p.status in ('01','02') then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Soma das 2 colunas' from ITEMFILEST it inner join PRODUTOCAD p on p.codpro = it.codpro where it.filial not in ('','07','61','18') and it.quant > 0 and p.status in('01','02') group by it.filial order by it.filial



    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 20 de setembro de 2012 19:50
  • Alexandre, bom dia. 

    Obrigado pelo apoio.

    Fiz o que você sugeriu, porém apresentou a seguinte mensagem:

    Msg 8120, Level 16, State 1, Line 2
    Column 'PRODUTOCAD.status' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    ou seja, está me dizendo que eu tenho que agrupar o campo status... 

    sexta-feira, 21 de setembro de 2012 13:50
  • Pode postar a estrutura da sua tabela e alguns exemplos de registros para que possamos lhe ajudar mais rapidamente?

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 14:05
    Moderador
  • Acho que consegui simular:

    Declare @PRODUTOCAD Table (codpro int, precocomp Decimal(12,5), Status Char(02))
    Declare @ITEMFILEST Table (filial int, codpro int, quant int)
    
    Insert Into @PRODUTOCAD Values (10, 15.50, '01'), (20, 18.00, '01'), (30, 22.35, '02'), (40, 26.70, '03')
    Insert Into @ITEMFILEST Values (1, 10, 5), (2, 10, 8), (1, 20, 10), (1, 30, 10), (1, 40, 12) 
    
    ;With CTE as
    (
    select
      IT.filial,
      P.status,
      case when p.status = '01' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 01',
      case when p.status = '02' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 02'
    from
      @ITEMFILEST it inner join @PRODUTOCAD p on p.codpro = it.codpro
    where
      it.filial not in ('','07','61','18')
      and it.quant > 0
      and p.status in('01','02')
    group by
      p.status, it.filial
    )
    Select
      filial,
      [Valor Status 01] = Sum([Valor Status 01]),
      [Valor Status 02] = Sum([Valor Status 02])
    From
      CTE
    Group by
      filial


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 14:25
    Moderador
  • Roberson, funcionou certinho cara!!!! Muito obrigado. 

    Agora só mais uma questão:

    Eu adicionei a coluna TOTAL, que a soma das outras duas. Eu preciso adicionar outra coluna mostrando o percentual da divisão da coluna

    [valor status 02] / [total]. Não consegui fazer isso. Segue o codigo:

              

    ;With CTE as
    (
    select
      IT.filial,
      P.status,
      case when p.status = '01' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 01',
      case when p.status = '02' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 02',
      cast(sum(it.quant * p.precocomp) as numeric (15,2)) as  'TOTAL'

    from
      ITEMFILEST it inner join PRODUTOCAD p on p.codpro = it.codpro
    where
      it.filial not in ('','07','61','18')
      and it.quant > 0
      and p.status in('01','02')
    group by
      p.status, it.filial
    )
    Select
      filial,
      [Valor Status 01] = Sum([Valor Status 01]),
      [Valor Status 02] = Sum([Valor Status 02]),
      [TOTAL] = SUM([TOTAL]),

    From
      CTE
    Group by  filial

    Obrigado.

    sexta-feira, 21 de setembro de 2012 17:31
  • Veja se é isso:

    Declare @PRODUTOCAD Table (codpro int, precocomp Decimal(12,5), Status Char(02))
    Declare @ITEMFILEST Table (filial int, codpro int, quant int)
    
    Insert Into @PRODUTOCAD Values (10, 15.50, '01'), (20, 18.00, '01'), (30, 22.35, '02'), (40, 26.70, '03')
    Insert Into @ITEMFILEST Values (1, 10, 5), (2, 10, 8), (1, 20, 10), (1, 30, 10), (1, 40, 12) 
    
    ;With CTE as
    (
    select
      IT.filial,
      P.status,
      case when p.status = '01' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 01',
      case when p.status = '02' then cast(sum(it.quant * p.precocomp) as numeric (15,2)) else 0 end as 'Valor Status 02',
      cast(sum(it.quant * p.precocomp) as numeric (15,2)) as  'TOTAL'
    from
      @ITEMFILEST it inner join @PRODUTOCAD p on p.codpro = it.codpro
    where
      it.filial not in ('','07','61','18')
      and it.quant > 0
      and p.status in('01','02')
    group by
      p.status, it.filial
    )
    Select
      filial,
      [Valor Status 01] = Sum([Valor Status 01]),
      [Valor Status 02] = Sum([Valor Status 02]),
      [TOTAL] = SUM([TOTAL]),
      [Percentual Status 01] = Case When SUM([TOTAL]) > 0 Then (Sum([Valor Status 01] * 100) / SUM([TOTAL])) Else 0 End,
      [Percentual Status 02] = Case When SUM([TOTAL]) > 0 Then (Sum([Valor Status 02] * 100) / SUM([TOTAL])) Else 0 End
    From
      CTE
    Group by
      filial


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 17:42
    Moderador
  • Roberson, é examente isso, muito obrigado!

    Eu consigo montar uma view com esse codigo?

    Obrigado.

    sexta-feira, 21 de setembro de 2012 18:35
  • OK Cesar.

    Views não se adaptam a este cenário. Normalmente são construídas somente com Selects. Sem grandes variações.

    Talvez a criação de uma procedure com este código lhe seja útil. Poderia inclusive passar como parâmetro os dados que usa para filtrar as informações.

    Observação: favor marcar todas as respostas que foram úteis ou que serviram exatamente como resposta ao seu problema. Obrigado.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 18:39
    Moderador