2014-05-23 6 views
2

중요한 GROUP BY 집계가있는 쿼리가 있습니다. 열 year, month, country, state, federation, city에 의해큐브와 롤업을 결합하는 방법?

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) 

I 그룹 : 여기에 단순화 된 스키마 (SQL Fiddle)입니다.

합계를 여러 단계로 가져와야하므로 ROLLUP 연산자를 사용합니다. 그러나 CUBEcountry (지리적 속성)과 federation (그리고 조직 속성)의 두 열에 적용하고 싶습니다.

내 쿼리에서 단지 CUBE이라면 나는 필요한 것보다 훨씬 많은 출력을 얻습니다. (실제로 모든 GROUP BY 열에 CUBE을 적용 할 필요가 없습니다.)

해결 방법이 있습니까?

+0

테스트 할 샘플 데이터를 줄 수 있습니까? –

+0

@ 861051069712110711711710997114 여기 단순한 피들 : http://sqlfiddle.com/#!3/e941a/1/0 – Fractaliste

+0

@ 861051069712110711711710997114 내가 원하는 큐브는 '국가'(지리적 특성)와 '연맹' organizationnal attribut) – Fractaliste

답변

2

SQL Server 2000은 비 유연성을 제공하지 않는 두 가지 구문의 비 ISO 호환 GROUP BY ... WITH ROLLUPGROUP BY ... WITH CUBE 만 지원합니다. 변형 또는 조합이없는 전체 롤업/큐브 만 가질 수 있습니다.

그러나 특정 경우에 해결 방법이 너무 복잡하지 않을 수 있습니다.

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에서 그것을 계산하고 ALL UNION으로 결과를 결합 수 :

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 
; 
+0

결국 부분적으로 당신의 아이디어를 따르고 그룹화 된 결과 집합의 'UNION'을 수행하지만 'ROLLUP'이 없습니다 (수동으로 수행합니다. 결과에 대해 일부 수학 함수를 계산해야하기 때문입니다 ROLLUP에서). – Fractaliste