如果我没记错的话,在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]
那么如何将总计1396移到最后一行?
答案 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值,例如在描述中)