source

CUBE와 ROLLUP의 차이점 이해

ittop 2023. 7. 6. 22:36
반응형

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 조항을 읽어보기로 결정했고 마이크로소프트의 기사로 시작했습니다.ROLLUP 절은 CUBE 절과 유사하지만 다음과 같은 방식으로 CUBE 절과 구별된다고 말했습니다.

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

그래서 저는 제 질문에 있는 ROLLUP을 CUBE로 대체하기로 결정했습니다.그들은 같은 결과를 얻었습니다.거기가 제가 헷갈리는 부분인 것 같아요.

제가 여기 있는 쿼리 유형을 사용하면 두 절 사이에 실질적인 차이가 없습니다.그래요?아니면, 제가 뭔가를 이해하지 못하는 건가요?마이크로소프트 기사를 다 읽었을 때 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으로 각 롤업 되어 있는 반면, 적으로각노대가능모든반포면는함를하기오시리나본롤업한드해에▁for▁essential▁whereas▁every,up,ROLLUPDAY를 , 계달그일유대로지다니합표/연않다층도시니합을지건고뛰을/을너일달▁will▁in(▁year▁keep표▁hierarchy▁whereas다계유다so시니합니day연층지▁won▁the).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

enter image description here

ROLLUP(한 열에 해당하는 총계를 찾을 수 있음)

모든 분기에서 각 학생의 총 점수를 얻습니다.

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

각 분기의 총 점수를 받아야 하는 경우

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

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

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

enter image description here

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

더하다Group by InvoiceDt, InvoiceCountry(또는 어떤 필드에서 더 많은 데이터를 얻을 수 있는지 확인합니다.

큐브를 사용하면 각 송장 Dt에 대한 합계가 제공되고 각 송장 국가에 대한 합계가 제공됩니다.

GROUPING SET, CUBE, ROLL UP.TL;DR에서 GROUP BY + UNION ALL을 어떤 식으로든 확장하여 집계를 가져오는 방법에 대한 자세한 내용을 확인할 수 있습니다. :)

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

투표된 모든 답변이 좋습니다.


일반적으로 한가지 중요한 차이점은

  1. 롤업 규격의 N개 요소는 N+1 그룹화 세트에 해당합니다.
  2. 큐브 규격의 N개 요소는 2^N 그룹화 세트에 해당합니다.

자세한 내용은 스파크 SQL과 관련된 내 기사를 참조하십시오.

예:

스토어_id,상품_타입

롤업은 다음과 같습니다.

GROUP BY store_id,product_type
 GROUPING SETS (
(store_id,product_type)
,(product_type)
, ())

2(n)개의 열 그룹화 집합에 대한 (n+1) = 3개의 열 조합

입방체는 다음과 같습니다.

GROUP BY store_id,product_type
 GROUPING SETS (
(store_id,product_type)
,(store_id)
,(product_type)
, ())

2(n)개의 열 그룹화 집합에 대한 (2^n) = 4개의 열 조합

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

반응형