Inquiridor
Operador ROLLUP

Pergunta
-
Pessoal,
Estou tentando usar o operador ROLLUP para exibir o total, mas não estou conseguindo, a consulta só fica processando.
SELECT estado.d02_nmdescricao AS 'ESTADO', COUNT(DISTINCT(venda.p02_cdid)) AS 'TOTAL' FROM p02_venda venda JOIN p01_pedido pedido ON pedido.p01_boexcluido = 0 AND pedido.p01_bosituacao = 1 AND pedido.p01_cdoperadora = 1 JOIN d03_pdv pdv ON pdv.d03_cdid = venda.p02_cdpdv AND pdv.d03_boexcluido = 0 JOIN d01_cidade cidade ON cidade.d01_cdid = pdv.d03_cdcidade AND cidade.d01_boexcluido = 0 JOIN d02_estado estado ON estado.d02_cdid = cidade.d01_cdestado AND estado.d02_boexcluido = 0 Where venda.p02_boexcluido = 0 AND (MONTH(venda.p02_dtcadastro) = MONTH(@inicio)) AND (YEAR(venda.p02_dtcadastro) = YEAR(@inicio)) AND ((venda.p02_fgorigem = @origem) OR (@origem = -1)) AND ((venda.p02_cdchip = @produto) OR (@produto = -1)) GROUP BY estado.d02_nmdescricao WITH ROLLUP ORDER BY estado.d02_nmdescricao
Desde já agradeço a todos!
Todas as Respostas
-
-
-
Eiras,
Inicialmente remova o Order By e o comando Rollup do Group By, execute a sua query.
Por padrão o Rollup é um operador normalmente utilizado em transações Select quando estamos trabalhando com agregação de valores, em conjunto com o comando Group By e também com a função Grouping declarada no Select.
Mas para que o Group By Rollup possa funcionar é necessário declarer quais colunas o Rollup vai ser aplicado, no seu caso você não especificou as colunas, veja abaixo os exemplos:
USE AdventureWorks2008R2; GO SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country' ,S.Name AS N'Store', H.SalesPersonID ,SUM(TotalDue) AS N'Total Sales' FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID INNER JOIN Sales.SalesTerritory T ON C.TerritoryID = T.TerritoryID INNER JOIN Sales.SalesOrderHeader H ON C.CustomerID = H.CustomerID WHERE T.[Group] = N'Europe' AND T.CountryRegionCode IN(N'DE', N'FR') AND H.SalesPersonID IN(287, 290, 288) AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ') GROUP BY ROLLUP( T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID) ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;
USE AdventureWorks2008R2; GO SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country' ,S.Name AS N'Store', H.SalesPersonID ,SUM(TotalDue) AS N'Total Sales' FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID INNER JOIN Sales.SalesTerritory T ON C.TerritoryID = T.TerritoryID INNER JOIN Sales.SalesOrderHeader H ON C.CustomerID = H.CustomerID WHERE T.[Group] = N'Europe' AND T.CountryRegionCode IN(N'DE', N'FR') AND H.SalesPersonID IN(287, 290, 288) AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ') GROUP BY ROLLUP( H.SalesPersonID, S.Name, T.CountryRegionCode, T.[Group]) ORDER BY H.SalesPersonID, S.Name, T.CountryRegionCode, T.[Group];
USE AdventureWorks2008R2; GO SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country' ,DATEPART(yyyy,OrderDate) AS 'Year' ,DATEPART(mm,OrderDate) AS 'Month' ,SUM(TotalDue) AS N'Total Sales' FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID INNER JOIN Sales.SalesTerritory T ON C.TerritoryID = T.TerritoryID INNER JOIN Sales.SalesOrderHeader H ON C.CustomerID = H.CustomerID WHERE T.[Group] = N'Europe' AND T.CountryRegionCode IN(N'DE', N'FR') AND DATEPART(yyyy,OrderDate) = '2006' GROUP BY ROLLUP(T.[Group], T.CountryRegionCode) ,ROLLUP(DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)) ORDER BY T.[Group], T.CountryRegionCode ,DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate);
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
- Editado Junior Galvão - MVPMVP sexta-feira, 14 de dezembro de 2012 12:48
-
Junior, sem o Rollup a query funciona perfeitamente.
Fiz igual ao exemplo e não resolveu.
SELECT estado.d02_nmdescricao AS 'ESTADO', COUNT(DISTINCT(venda.p02_cdid)) AS 'TOTAL' FROM p02_venda venda JOIN p01_pedido pedido ON pedido.p01_boexcluido = 0 AND pedido.p01_bosituacao = 1 AND pedido.p01_cdoperadora = 1 JOIN d03_pdv pdv ON pdv.d03_cdid = venda.p02_cdpdv AND pdv.d03_boexcluido = 0 JOIN d01_cidade cidade ON cidade.d01_cdid = pdv.d03_cdcidade AND cidade.d01_boexcluido = 0 JOIN d02_estado estado ON estado.d02_cdid = cidade.d01_cdestado AND estado.d02_boexcluido = 0 Where venda.p02_boexcluido = 0 AND (MONTH(venda.p02_dtcadastro) = MONTH(@inicio)) AND (YEAR(venda.p02_dtcadastro) = YEAR(@inicio)) AND ((venda.p02_fgorigem = @origem) OR (@origem = -1)) AND ((venda.p02_cdchip = @produto) OR (@produto = -1)) GROUP BY ROLLUP (estado.d02_nmdescricao )
-
Usando como parâmetros o Script do Junior,
Pode ser usado um with
; with tabela as ( SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country' ,DATEPART(yyyy,OrderDate) AS 'Year' ,DATEPART(mm,OrderDate) AS 'Month' ,SUM(TotalDue) AS N'Total Sales' FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID INNER JOIN Sales.SalesTerritory T ON C.TerritoryID = T.TerritoryID INNER JOIN Sales.SalesOrderHeader H ON C.CustomerID = H.CustomerID WHERE T.[Group] = N'Europe' AND T.CountryRegionCode IN(N'DE', N'FR') AND DATEPART(yyyy,OrderDate) = '2006' GROUP BY T.[Group],T.CountryRegionCode,DATEPART(yyyy,OrderDate),DATEPART(mm,OrderDate) ) SELECT Region, Country, [Year], [Month], [Total Sales] FROM TABELA UNION SELECT NULL Region, NULL Country, NULL [Year], NULL [Month], sum([Total Sales])[Total Sales] FROM TABELA
...
- Sugerido como Resposta Caio Morais quarta-feira, 27 de março de 2013 13:32