none
Operador ROLLUP RRS feed

  • 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!

    quinta-feira, 13 de dezembro de 2012 20:10

Todas as Respostas

  • Eiras, remova o ORDER BY e veja se executa.

    sexta-feira, 14 de dezembro de 2012 11:20
  • Juliano, continua só processando.
    sexta-feira, 14 de dezembro de 2012 12:27
  • 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]


    sexta-feira, 14 de dezembro de 2012 12:41
  • 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 )

    sexta-feira, 14 de dezembro de 2012 13:03
  • 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
    segunda-feira, 25 de fevereiro de 2013 17:24