CREATE TABLE #foo
(
itemid int,
proddte date,
qty int
);
INSERT #foo(itemid,proddte,qty) VALUES
(1,'20140101',5),(1,'20140102',7),(2,'20150101',10);
-- if it really needs to be a column with the same value
-- in every row, just calculate once and assign it to a variable
DECLARE @sum int = (SELECT SUM(qty) FROM #foo);
SELECT itemid, proddte, GroupedSum = SUM(qty), GrandTotal = @sum
FROM #foo
GROUP BY itemid, proddte;
-- if the grand total can be expressed on its own row,
-- you can use GROUP BY GROUPING SETS:
SELECT itemid, proddte, SUM(qty)
FROM #foo GROUP BY GROUPING SETS((),(itemid,proddte));
-- if that syntax is confusing, you can use a less
-- efficient UNION ALL:
SELECT itemid, proddte, SUM(qty)
FROM #foo GROUP BY itemid,proddte
UNION ALL
SELECT NULL, NULL, SUM(qty)
FROM #foo;
GO
DROP TABLE #foo;
GROUP BY GROUPING SETS
ある基本的にUNION ALL
。()
手段は、単に取るSUM
に関係なく、列挙された任意の他のグループが別々に集約されますグループ化します。GROUP BY GROUPING SETS ((itemid),(itemid,proddte))
違いを確認してみてください。
詳細については、ドキュメントを参照してください。
ROLLUP、CUBE、およびGROUPING SETSでのGROUP BYの使用
Andriyが述べたように、上記のクエリは次のように記述することもできます。
GROUP BY ROLLUP( (itemid,proddte) )
そこにある2つの列は、追加の括弧のペアで囲まれているため、1つの単位になっています。Andriy は Stack Exchange Data Explorerでホストされているデモを書きました。
GROUP BY ROLLUP((itemid,proddte))
同じ結果が生成され、混乱が少なくなる可能性があります。