我有一个重要的GROUP BY
聚合查询。这是一个简化的模式(SQL Fiddle):
CREATE TABLE [data] (
[year] [int] NOT NULL ,
[month] [int] NOT NULL ,
[country] [varchar] (32) NOT NULL ,
[state] [varchar] (32),
[city] [varchar] (32) NOT NULL ,
[federation] [varchar] (32) NOT NULL ,
[id] [int] NOT NULL ,
[price] [int] NOT NULL );
INSERT data values(2012, 12, 'France', NULL, 'Paris', 'FFJ', 1, 23)
INSERT data values(2013, 2, 'France', NULL, 'Paris', 'FFV', 2, 212)
INSERT data values(2012, 1, 'USA', 'CA', 'Paris', 'FFV', 3, 23)
INSERT data values(2013, 12, 'France', NULL, 'Paris', 'FFV', 4, 273)
INSERT data values(2012, 9, 'USA', 'OR', 'Lake Oswego', 'FFV', 5, 743)
INSERT data values(2012, 11, 'France', NULL, 'Paris', 'FFJ', 6, 3)
INSERT data values(2012, 12, 'France', NULL, 'Paris', 'FFV', 7, 231)
INSERT data values(2012, 12, 'USA', 'CA', 'St Monica', 'FFV', 8, 41)
INSERT data values(2012, 12, 'France', NULL, 'Paris', 'FFV', 9, 96)
INSERT data values(2012, 12, 'France', NULL, 'Vire', 'FFJ', 10, 23)
INSERT data values(2012, 12, 'France', NULL, 'Paris', 'FFV', 11, 58)
INSERT data values(2012, 12, 'France', NULL, 'Nice', 'FFV', 12, 773)
我按列year, month, country, state, federation, city
进行分组。
我使用ROLLUP
运算符,因为我需要在多个级别上获得总计。但我还想将CUBE
应用于两个列country
(地理属性)和federation
(以及组织属性)。
如果我在查询中只是CUBE
,我得到的输出比我需要的多得多。 (我真的不需要将CUBE
应用到我的所有GROUP BY列。)
是否存在变通方法?
答案 0 :(得分:2)
SQL Server 2000仅支持不符合ISO标准的GROUP BY ... WITH ROLLUP
和GROUP BY ... WITH CUBE
,这两种语法不具备很大的灵活性。您只能拥有完整的汇总/多维数据集,没有变化或组合。
但是,在您的特定情况下的解决方法可能不会太麻烦。 ROLLUP会给你以下分组:
year, month, country, state, federation, city
year, month, country, state, federation
year, month, country, state
year, month, country
year, month
year
() -- grand total
我对你想要的东西的理解是这样的:
year, month, country, state, federation, city
year, month, country, state, federation
year, month, country, state
year, month, country, federation
year, month, country
year, month
year
()
显然你需要在ROLLUP输出中再添加一个分组子集,即这一个:
year, month, country, federation
您可以在单独的SELECT中计算它并将结果与UNION ALL:
组合SELECT ...
FROM dbo.data
GROUP BY
year, month, country, state, federation, city
WITH ROLLUP
UNION ALL
SELECT ...
FROM dbo.data
GROUP BY
year, month, country, federation
;