Usuário com melhor resposta
Dificuldade em montar uma query - SQL Server 2008

Pergunta
-
Pessoal boa noite, alguem poderia me ajudar na seguinte questão...
abaixo tenho uma query que basicamente tras valores por mes, vejam abaixo a query:
é uma teabela onde eu quero colocar em linha por mes, janeiro, fevereiro e etc.
mas o resultado retorna 12 linhas, eu entendo, pois ela esta rodando pra todos os meses, mas no caso, como eu teria que fazer para que ficasse em linha, pois por exemplo na coluna JANEIRO ele tras ok, mas até ele imprimir o valor de DEZEMBRO, ele coloca 11 linhas em branco (NULL) coloquei o print do resultado abaixo da query
Obrigado!!
select CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '1' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Janeiro', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '2' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Fevereiro', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '3' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Março', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '4' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Abril', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '5' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Mail', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '6' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Junho', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '7' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Julho', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '8' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Agosto', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '9' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Setembro', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '10' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Outubro', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '11' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Novembro', CASE WHEN DATEPART (YEAR, TITMPERIODOORCAMENTO.DATAINICIO) = 2014 AND DATEPART (MONTH,TITMPERIODOORCAMENTO.DATAINICIO) = '12' THEN isnull (TITMORCAMENTO.VALORORCADO,'0,00') END AS 'Dezembro' from TORCAMENTO inner join TTBORCAMENTO on TTBORCAMENTO.CODTBORCAMENTO = TORCAMENTO.CODTBORCAMENTO inner join TITMORCAMENTO on TITMORCAMENTO.IDORCAMENTO = TORCAMENTO.IDORCAMENTO left join TITMPERIODOORCAMENTO on TITMPERIODOORCAMENTO.IDPERIODO = TORCAMENTO.IDPERIODO WHERE TORCAMENTO.CODTBORCAMENTO = '1.001.001'
Abaixo o resultado da query
Forum SQL Server
Respostas
-
Tenta assim:
IF OBJECT_ID('TEMPDB..#Teste') IS NOT NULL
BEGIN
DROP TABLE #Teste;
END
CREATE TABLE #Teste ( ID_Fatura Integer Identity PRIMARY KEY,
ID_Empresa Integer NOT NULL,
ID_Fornecedor Integer NOT NULL,
DT_Fatura SmallDateTime NOT NULL,
VL_Fatura Numeric(9,2) NOT NULL );
CREATE INDEX ix_ ON #Teste ( ID_Empresa , ID_Fornecedor, DT_Fatura ) INCLUDE (VL_Fatura);
INSERT INTO #TESTE VALUES (1, 698, '2015-01-03' , 144.10 );
INSERT INTO #TESTE VALUES (1, 698, '2015-02-02' , 50.00 );
INSERT INTO #TESTE VALUES (1, 698, '2015-03-25' , 55.47 );
INSERT INTO #TESTE VALUES (1, 698, '2015-04-11' , 40.20 );
INSERT INTO #TESTE VALUES (1, 698, '2015-05-04' , 99.35 );
INSERT INTO #TESTE VALUES (1, 698, '2015-06-12' , 13.25 );
INSERT INTO #TESTE VALUES (1, 698, '2015-07-11' , 20.00 );
INSERT INTO #TESTE VALUES (1, 698, '2015-08-31' , 7.40 );
INSERT INTO #TESTE VALUES (1, 698, '2015-09-07' , 10.00 );
INSERT INTO #TESTE VALUES (1, 698, '2015-10-08' , 22.42 );
INSERT INTO #TESTE VALUES (1, 698, '2015-11-15' , 14.13 );
INSERT INTO #TESTE VALUES (1, 698, '2015-12-15' , 10.00 );
INSERT INTO #TESTE VALUES (1, 698, '2016-01-08' , 135.56 );
INSERT INTO #TESTE VALUES (1, 698, '2016-01-15' , 35.50 );
INSERT INTO #TESTE VALUES (1, 698, '2016-02-20' , 45.35 );
INSERT INTO #TESTE VALUES (1, 698, '2016-03-10' , 36.20 );
INSERT INTO #TESTE VALUES (1, 698, '2016-04-05' , 45.29 );
INSERT INTO #TESTE VALUES (1, 698, '2016-04-16' , 50.40 );
INSERT INTO #TESTE VALUES (1, 698, '2016-04-30' , 13.30 );
INSERT INTO #TESTE VALUES (1, 698, '2016-05-11' , 18.20 );
INSERT INTO #TESTE VALUES (1, 698, '2016-05-31' , 7.40 );
INSERT INTO #TESTE VALUES (1, 698, '2016-06-07' , 91.37 );
INSERT INTO #TESTE VALUES (1, 698, '2016-07-08' , 100.20 );
INSERT INTO #TESTE VALUES (1, 698, '2016-07-15' , 14.13 );
SELECT YEAR(DT_Fatura) Ano,
SUM(CASE WHEN MONTH(DT_Fatura) = 01 THEN VL_Fatura ELSE 0 END) AS [Jan],
SUM(CASE WHEN MONTH(DT_Fatura) = 02 THEN VL_Fatura ELSE 0 END) AS [Fev],
SUM(CASE WHEN MONTH(DT_Fatura) = 03 THEN VL_Fatura ELSE 0 END) AS [Mar],
SUM(CASE WHEN MONTH(DT_Fatura) = 04 THEN VL_Fatura ELSE 0 END) AS [Abr],
SUM(CASE WHEN MONTH(DT_Fatura) = 05 THEN VL_Fatura ELSE 0 END) AS [Mai],
SUM(CASE WHEN MONTH(DT_Fatura) = 06 THEN VL_Fatura ELSE 0 END) AS [Jun],
SUM(CASE WHEN MONTH(DT_Fatura) = 07 THEN VL_Fatura ELSE 0 END) AS [Jul],
SUM(CASE WHEN MONTH(DT_Fatura) = 08 THEN VL_Fatura ELSE 0 END) AS [Ago],
SUM(CASE WHEN MONTH(DT_Fatura) = 09 THEN VL_Fatura ELSE 0 END) AS [Set],
SUM(CASE WHEN MONTH(DT_Fatura) = 10 THEN VL_Fatura ELSE 0 END) AS [Out],
SUM(CASE WHEN MONTH(DT_Fatura) = 11 THEN VL_Fatura ELSE 0 END) AS [Nov],
SUM(CASE WHEN MONTH(DT_Fatura) = 12 THEN VL_Fatura ELSE 0 END) AS [Dez],
SUM(VL_Fatura) AS [Total]
FROM #Teste (NOLOCK)
WHERE ID_Empresa = 1
AND ID_Fornecedor = 698
GROUP BY Year(DT_Fatura);
- Sugerido como Resposta Zé Bill terça-feira, 20 de setembro de 2016 16:37
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 20 de setembro de 2016 18:28
Todas as Respostas
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 20 de setembro de 2016 15:38
-
Olá José, boa tarde
e o SQL srver 2008R2, mas o pivot eu nao consigo utilizar por causa do nivel de compatibilidade da base, que por causa da aplicação nao permite o pivot.
Mas vou testar o envelopamento em cada linha, achei uma boa.
Obrigado pela dica.
Forum SQL Server
-
Diego,
Neste caso, o que você teria que fazer é criar um Pivot artificial, ou seja, armazenar em uma determinada tabela justamente este agrupamento de dados organizados por mês de acordo com suas movimentações, após isso você vai conseguir apresentar os dados de maneira organizada sem ter os valores em nulo.
Algo como se fosse um sumário da sua movimentação anual, especificando os períodos desejados de datas e durante a execução deste período ir armazenando estes dados resumidos contendo os meses de movimentação de cada período.
Ao final você apresenta justamente estes dados sumarizados no decorrer de um ano, todo este processo poderia ser realizar por uma stored procedure e a apresentação dos dados através de uma visão indexada para ajudar na busca e apresentação dos dados.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Tenta assim:
IF OBJECT_ID('TEMPDB..#Teste') IS NOT NULL
BEGIN
DROP TABLE #Teste;
END
CREATE TABLE #Teste ( ID_Fatura Integer Identity PRIMARY KEY,
ID_Empresa Integer NOT NULL,
ID_Fornecedor Integer NOT NULL,
DT_Fatura SmallDateTime NOT NULL,
VL_Fatura Numeric(9,2) NOT NULL );
CREATE INDEX ix_ ON #Teste ( ID_Empresa , ID_Fornecedor, DT_Fatura ) INCLUDE (VL_Fatura);
INSERT INTO #TESTE VALUES (1, 698, '2015-01-03' , 144.10 );
INSERT INTO #TESTE VALUES (1, 698, '2015-02-02' , 50.00 );
INSERT INTO #TESTE VALUES (1, 698, '2015-03-25' , 55.47 );
INSERT INTO #TESTE VALUES (1, 698, '2015-04-11' , 40.20 );
INSERT INTO #TESTE VALUES (1, 698, '2015-05-04' , 99.35 );
INSERT INTO #TESTE VALUES (1, 698, '2015-06-12' , 13.25 );
INSERT INTO #TESTE VALUES (1, 698, '2015-07-11' , 20.00 );
INSERT INTO #TESTE VALUES (1, 698, '2015-08-31' , 7.40 );
INSERT INTO #TESTE VALUES (1, 698, '2015-09-07' , 10.00 );
INSERT INTO #TESTE VALUES (1, 698, '2015-10-08' , 22.42 );
INSERT INTO #TESTE VALUES (1, 698, '2015-11-15' , 14.13 );
INSERT INTO #TESTE VALUES (1, 698, '2015-12-15' , 10.00 );
INSERT INTO #TESTE VALUES (1, 698, '2016-01-08' , 135.56 );
INSERT INTO #TESTE VALUES (1, 698, '2016-01-15' , 35.50 );
INSERT INTO #TESTE VALUES (1, 698, '2016-02-20' , 45.35 );
INSERT INTO #TESTE VALUES (1, 698, '2016-03-10' , 36.20 );
INSERT INTO #TESTE VALUES (1, 698, '2016-04-05' , 45.29 );
INSERT INTO #TESTE VALUES (1, 698, '2016-04-16' , 50.40 );
INSERT INTO #TESTE VALUES (1, 698, '2016-04-30' , 13.30 );
INSERT INTO #TESTE VALUES (1, 698, '2016-05-11' , 18.20 );
INSERT INTO #TESTE VALUES (1, 698, '2016-05-31' , 7.40 );
INSERT INTO #TESTE VALUES (1, 698, '2016-06-07' , 91.37 );
INSERT INTO #TESTE VALUES (1, 698, '2016-07-08' , 100.20 );
INSERT INTO #TESTE VALUES (1, 698, '2016-07-15' , 14.13 );
SELECT YEAR(DT_Fatura) Ano,
SUM(CASE WHEN MONTH(DT_Fatura) = 01 THEN VL_Fatura ELSE 0 END) AS [Jan],
SUM(CASE WHEN MONTH(DT_Fatura) = 02 THEN VL_Fatura ELSE 0 END) AS [Fev],
SUM(CASE WHEN MONTH(DT_Fatura) = 03 THEN VL_Fatura ELSE 0 END) AS [Mar],
SUM(CASE WHEN MONTH(DT_Fatura) = 04 THEN VL_Fatura ELSE 0 END) AS [Abr],
SUM(CASE WHEN MONTH(DT_Fatura) = 05 THEN VL_Fatura ELSE 0 END) AS [Mai],
SUM(CASE WHEN MONTH(DT_Fatura) = 06 THEN VL_Fatura ELSE 0 END) AS [Jun],
SUM(CASE WHEN MONTH(DT_Fatura) = 07 THEN VL_Fatura ELSE 0 END) AS [Jul],
SUM(CASE WHEN MONTH(DT_Fatura) = 08 THEN VL_Fatura ELSE 0 END) AS [Ago],
SUM(CASE WHEN MONTH(DT_Fatura) = 09 THEN VL_Fatura ELSE 0 END) AS [Set],
SUM(CASE WHEN MONTH(DT_Fatura) = 10 THEN VL_Fatura ELSE 0 END) AS [Out],
SUM(CASE WHEN MONTH(DT_Fatura) = 11 THEN VL_Fatura ELSE 0 END) AS [Nov],
SUM(CASE WHEN MONTH(DT_Fatura) = 12 THEN VL_Fatura ELSE 0 END) AS [Dez],
SUM(VL_Fatura) AS [Total]
FROM #Teste (NOLOCK)
WHERE ID_Empresa = 1
AND ID_Fornecedor = 698
GROUP BY Year(DT_Fatura);
- Sugerido como Resposta Zé Bill terça-feira, 20 de setembro de 2016 16:37
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 20 de setembro de 2016 18:28
-