在SQL Server中使用GROUPING SETS时如何对特定列进行排序?

时间:2014-08-21 17:03:54

标签: sql sql-server sorting group-by sql-order-by

如果我没记错的话,在SQL Server中,不建议使用" ORDER BY"当已经有GROUP BY GROUPING SETS时。

我有两列:[UPC#]& [描述] 两者都是varchar。

我的分组设置如下:

GROUP BY 
GROUPING SETS 
(
    ([UPC],[Description])
    ,()     
)

我没有排序'但它会自动对“描述”列进行排序。

如果我添加了第3列,sum(Qty),那么它就不再按说明排序了。 但是如果我加上

ORDER BY [Description]

总和(数量)将在第一行而不是最后一行。

有没有办法对Description列进行排序,仍然可以将sum(Qty)的总和改为最后一行?

感谢。

***编辑1 **** 这是我要求的代码:

SELECT
    CASE WHEN [UPC] IS NULL THEN ''
    ELSE [UPC]
    END AS [UPC]

    ,   CASE WHEN [Description] IS NULL THEN ''
        ELSE [Description] 
        END AS [Description]

    ,CONVERT(int,ROUND(SUM([QtySold]),0)) AS [Total Count]

FROM 
(
    SELECT 
        [UPC]
        ,[Description]
        , sum([QtySold]) as [QtySold]
    FROM [JS_Data].[dbo].[View_ItemMovement_AllItems_withoutZero]
    WHERE 
        ([Description] LIKE '%drink%') 
        AND (SaleDate BETWEEN '2014-01-01' AND '2014-01-15')
        AND ( (StoreNumber = '1') OR (StoreNumber = '2') OR (StoreNumber = '3') OR (StoreNumber = '4') OR (StoreNumber = '6') OR (StoreNumber = '7') OR (StoreNumber = '8') )
    GROUP BY 
            [UPC]
            ,[Description]
) a

GROUP BY 
GROUPING SETS 
    (
        (
            [UPC]
            ,[Description]
        )
        ,()     
    )

ORDER BY [Description]

enter image description here

那么如何将总计1396移到最后一行?

2 个答案:

答案 0 :(得分:2)

我意识到这个问题有点老化,但今天在MCSA学习指南中遇到了一个例子,我想我会分享。我已对此进行了测试,并且它使用了几乎相同的分组设置。

...
GROUP BY GROUPING SETS 
(
    ([UPC],[Description])
    ,()     
)
ORDER BY GROUPING(UPC);

答案 1 :(得分:1)

我认为您应该了解grouping()函数,如果传入列加入某些聚合分组并且,则当前值为{{}时,它将返回1 1}}。当然,我们需要使用NULL子句做一些技巧,如下所示:

Order By

我想在这种情况下你甚至可以检查--.... GROUP BY GROUPING SETS ( ( [UPC] ,[Description] ) ,() ) ORDER BY CASE WHEN -- this ensures the total row is always put at the end GROUPING([UPC]) = 1 AND GROUPING([Description]) = 1 THEN '1' ELSE '0' + [Description] END 而不是NULL,但它不安全(如果有一些实际的NULL值,例如在描述中)