2011-08-13 2 views
56

내 임무는 "각 날짜에 대해 얼마나 많은 송장을 적립 했습니까?"CUBE와 ROLLUP의 차이점에 대해 알아보기

나는 약간 붙어서 교수에게 도움을 요청했습니다. 그녀는 나에게 "각 유형과 버전의 스토브가 몇 개나 만들어 졌습니까?"라는 질문에 대한 질문을 이메일로 보냈습니다. 도전 과제가 있지만 추가 점수가없는 경우 총 스토브 개수를 포함하십시오. " 내 요구 사항을 충족 할 때까지

SELECT STOVE.Type + STOVE.Version AS 'Type+Version' 
, COUNT(*) AS 'The Count' 
FROM STOVE 
GROUP BY STOVE.Type + STOVE.Version WITH ROLLUP; 

그래서, 나는 그 쿼리를 쥐게 :

그녀가 나를 보내신 쿼리이었다. 이것은 내가 생각해 낸 것입니다 :

SELECT InvoiceDt 
, COUNT(InvoiceNbr) AS 'Number of Invoices' 
FROM INVOICE 
GROUP BY InvoiceDt WITH ROLLUP 
ORDER BY InvoiceDt ASC; 

그리고 나는 다음과 같은 결과를 보냈습니다.

어쨌든 ROLLUP 절을 읽고 Microsoft의 기사로 시작했습니다. 그것은 롤업 절은 CUBE 절과 유사이라고 말했지만 그것은 다음과 같은 방법으로 CUBE 절과 구별되었다 :

  1. CUBE 선택한 열의 값의 모든 조합에 대한 집계를 표시하는 결과 집합을 생성합니다.
  2. ROLLUP은 선택한 열의 값 계층 구조에 대한 집계를 보여주는 결과 집합을 생성합니다.

그래서 내 쿼리에서 ROLLUP을 CUBE로 대체하여 어떤 일이 발생하는지 확인하기로했습니다. 그들은 같은 결과를 냈다. 나는 그것이 내가 혼란스러워하는 곳이라고 생각한다.

내가 여기있는 쿼리 유형을 사용하는 경우 두 절 사이에 실제적인 차이가 없다고 생각됩니다. 그게 맞습니까? 또는, 나는 무언가를 이해하지 못하고 있는가? Microsoft 기사를 읽었을 때 CUBE 절을 사용하여 내 결과가 달라져야한다고 생각했습니다.

답변

130

단일 열을 롤업하기 때문에 차이가 나타나지 않습니다.

YEAR, MONTH, DAY 
YEAR, MONTH 
YEAR, DAY 
YEAR 
MONTH, DAY 
MONTH 
DAY 
() 

CUBE : 그것은 다음과 같은 것, CUBE

YEAR, MONTH, DAY 
YEAR, MONTH 
YEAR 
() 

하십시오 ROLLUP으로 우리가

ROLLUP (YEAR, MONTH, DAY)

할 경우 예를 고려, 다음과 같은 출력을해야합니다 기본적으로 각 노드에 대해 가능한 모든 롤업 시나리오를 포함하는 반면 ROLLUP은 계층 구조를 그대로 유지합니다 (따라서 MONTH를 건너 뛰고 YEAR/DAY를 나타내지는 않지만 CUBE이 표시됩니다)

이렇게하면 롤업 한 열만 있었기 때문에 차이점을 볼 수 없었습니다 .

희망이 있습니다.

+1

흥미를 얻기 위해 어떤 방법으로 ALL GROUP BY + UNION을 확장합니다. 왜 디자이너가 하나를 고르고 행동 특성에 대한 추가 특성 매개 변수를 추가하지 않았는지 궁금합니다. 근본적으로 같은 일을하지만 약간 다른 것을 구별하는 것은 꽤 어리 석다. – user2326106

6

그룹화 할 열이 하나뿐이기 때문입니다.

Group by InvoiceDt, InvoiceCountry 추가 (또는 어떤 필드는 당신에게 더 많은 데이터를 제공 할 것입니다.

는 큐브와

각 InvoiceDt 당신에게 합계를 줄 것이다 각 InvoiceCountry의 합계를 얻을 것이다.

62

을 우리의 차이를 이해할 수 ROLLUP 및 CUBE를 간단한 예제로 사용하여 학생들에게 분기 별 테스트 결과가 포함 된 테이블이 있다고 가정합니다. 경우에 따라 분기와 학생에 해당하는 합계를 확인해야합니다.

SELECT * INTO #TEMP 
FROM 
(
    SELECT 'Quarter 1' PERIOD,'Amar' NAME ,97 MARKS 
    UNION ALL 
    SELECT 'Quarter 1','Ram',88 
    UNION ALL 
    SELECT 'Quarter 1','Simi',76 
    UNION ALL 
    SELECT 'Quarter 2','Amar',94 
    UNION ALL 
    SELECT 'Quarter 2','Ram',82 
    UNION ALL 
    SELECT 'Quarter 2','Simi',71 
    UNION ALL 
    SELECT 'Quarter 3' ,'Amar',95 
    UNION ALL 
    SELECT 'Quarter 3','Ram',83 
    UNION ALL 
    SELECT 'Quarter 3','Simi',77 
    UNION ALL 
    SELECT 'Quarter 4' ,'Amar',91 
    UNION ALL 
    SELECT 'Quarter 4','Ram',84 
    UNION ALL 
    SELECT 'Quarter 4','Simi',79 
)TAB 

enter image description here

1. ROLLUP (하나 개의 컬럼에 해당하는 위해 총을 찾을 수)

의 (a) 모든 분기에서 각 학생의 총 점수를 얻을.

SELECT * FROM #TEMP 
UNION ALL 
SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH ROLLUP 
HAVING PERIOD IS NULL AND NAME IS NOT NULL 
// Having is used inorder to emit a row that is the total of all totals of each student 

는 다음의 결과 (A)

enter image description here

(b)는 당신이의 결과에 따라 매 분기

SELECT * FROM #TEMP 
UNION ALL 
SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY PERIOD,NAME 
WITH ROLLUP 
HAVING PERIOD IS NOT NULL AND NAME IS NULL 

의 총 점수를 얻을 필요 넣다 (b)

enter image description here

01 23,516,

2 CUBE

SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH CUBE 
HAVING PERIOD IS NOT NULL OR NAME IS NOT NULL 

다음은 CUBE

enter image description here

이제 당신에 대해 궁금 할의 결과 (단일 샷 분기 총뿐만 아니라 학생을 찾기) ROLLUP과 CUBE의 실시간 사용. 때로는 한 번에 각 학생의 합계와 각 학생의 합계를 볼 필요가있는 보고서가 필요합니다. 여기에 예제가 있습니다

위의 CUBE 쿼리를 두 총계가 모두 필요하므로 약간 변경했습니다.

SELECT CASE WHEN PERIOD IS NULL THEN 'TOTAL' ELSE PERIOD END PERIOD, 
CASE WHEN NAME IS NULL THEN 'TOTAL' ELSE NAME END NAME, 
SUM(MARKS) MARKS 
INTO #TEMP2 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH CUBE 

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + PERIOD + ']', 
       '[' + PERIOD + ']') 
       FROM (SELECT DISTINCT PERIOD FROM #TEMP2) PV 
       ORDER BY PERIOD  


DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT * FROM #TEMP2 
      ) x 
      PIVOT 
      (
       SUM(MARKS) 
       FOR [PERIOD] IN (' + @cols + ') 
      ) p;' 

EXEC SP_EXECUTESQL @query 

이제 당신은 그룹화 세트, CUBE, 롤 UP에 대한 자세한 내용을 찾을 수 있습니다

enter image description here

관련 문제