Usuário com melhor resposta
Consulta SQL

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.
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.brSe 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.- Sugerido como Resposta Roberson Ferreira _Moderator sexta-feira, 21 de setembro de 2012 17:47
- Marcado como Resposta Harley Araujo segunda-feira, 24 de setembro de 2012 11:30
-
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.brSe 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.- Sugerido como Resposta Roberson Ferreira _Moderator sexta-feira, 21 de setembro de 2012 17:47
- Marcado como Resposta Harley Araujo segunda-feira, 24 de setembro de 2012 11:30
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.
- Sugerido como Resposta Alexandre Matayosi quinta-feira, 20 de setembro de 2012 19:51
-
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...
-
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.brSe 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. -
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.brSe 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.- Sugerido como Resposta Roberson Ferreira _Moderator sexta-feira, 21 de setembro de 2012 17:47
- Marcado como Resposta Harley Araujo segunda-feira, 24 de setembro de 2012 11:30
-
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 filialObrigado.
-
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.brSe 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.- Sugerido como Resposta Roberson Ferreira _Moderator sexta-feira, 21 de setembro de 2012 17:47
- Marcado como Resposta Harley Araujo segunda-feira, 24 de setembro de 2012 11:30
-
-
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.brSe 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.