IT박스

CUBE와 ROLLUP의 차이점 이해

itboxs 2020. 11. 19. 07:58
반응형

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 의 기사로 시작했습니다 . ROLLUP 절은 CUBE 절과 비슷하지만 다음과 같은 방식으로 CUBE 절과 구별된다고합니다.

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

그래서 어떤 일이 발생하는지보기 위해 쿼리의 ROLLUP을 CUBE로 대체하기로 결정했습니다. 그들은 같은 결과를 낳았습니다. 나는 그것이 내가 혼란스러워하는 곳이라고 생각합니다.

내가 여기있는 쿼리 유형을 사용하는 경우 두 절간에 실질적인 차이가없는 것 같습니다. 맞습니까? 아니면 내가 뭔가를 이해하지 못하고 있습니까? Microsoft 기사를 다 읽었을 때 CUBE 절을 사용하면 결과가 달라야한다고 생각했습니다.


단일 열만 롤업하므로 차이가 없습니다. 우리가하는 예를 고려하십시오

ROLLUP (YEAR, MONTH, DAY)

를 사용 ROLLUP하면 다음과 같은 출력이 나타납니다.

YEAR, MONTH, DAY
YEAR, MONTH
YEAR
()

을 사용 CUBE하면 다음이 포함됩니다.

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

CUBE기본적으로 각 노드에 대해 가능한 모든 롤업 시나리오를 포함하는 반면 ROLLUP계층 구조는 그대로 유지합니다 (따라서 MONTH를 건너 뛰지 않고 YEAR / DAY를 표시하는 반면에 CUBE).

이것이 롤업중인 열이 하나뿐이므로 차이를 보지 못한 이유입니다.

도움이되기를 바랍니다.


간단한 예를 들어 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

여기에 이미지 설명 입력

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)의 결과입니다.

여기에 이미지 설명 입력

(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)의 결과입니다.

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

이제 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

이제 다음과 같은 결과를 얻을 수 있습니다.

여기에 이미지 설명 입력


그룹화하는 열이 하나만 있기 때문입니다.

추가 Group by InvoiceDt, InvoiceCountry(또는 어떤 필드에서든 더 많은 데이터를 제공합니다.

큐브를 사용하면 각 InvoiceDt에 대한 합계가 제공되고 각 InvoiceCountry에 대한 합계가 제공됩니다.


GROUPING SET, CUBE, ROLL UP에 대한 자세한 내용을 확인할 수 있습니다. TL; DR 그들은 집계를 얻기 위해 GROUP BY + UNION ALL을 몇 가지 방법으로 확장합니다. :)

https://technet.microsoft.com/en-us/library/bb510427(v=sql.105).aspx

참고 URL : https://stackoverflow.com/questions/7053471/understanding-the-differences-between-cube-and-rollup

반응형