1. 커스텀 소계 또는 합계 로직
ROLLUP은 고정된 방식으로 소계와 합계를 계산합니다. 하지만 특정 컬럼에만 소계를 구하거나, 여러 테이블에서 데이터를 병합하는 등의 복잡한 커스텀 로직이 필요할 경우 UNION ALL이 적합합니다.
예시: 각 지역의 소계는 구하지만, 특정 제품군의 소계는 구하지 않음
sql
코드 복사
SELECT Region, Product, SUM(Amount) AS TotalAmount
FROM Sales
GROUP BY Region, Product
UNION ALL
SELECT Region, 'Subtotal', SUM(Amount)
FROM Sales
WHERE Product IN ('Product A', 'Product B') -- 특정 조건만 소계
GROUP BY Region
UNION ALL
SELECT 'Total', 'All Products', SUM(Amount)
FROM Sales;
2. 서로 다른 계산 방식 결합
ROLLUP은 단일 집계 로직에 의해 동작하지만, 각기 다른 계산 방식을 결합하려면 UNION ALL이 필요합니다.
예시: 금액 합계와 거래 건수 소계를 동시에 계산
sql
코드 복사
SELECT Region, Product, SUM(Amount) AS TotalAmount, NULL AS TotalCount
FROM Sales
GROUP BY Region, Product
UNION ALL
SELECT Region, 'Subtotal', SUM(Amount), COUNT(*) AS TotalCount
FROM Sales
GROUP BY Region;
3. 여러 테이블 병합과 계산
ROLLUP은 단일 테이블에 대해서만 동작합니다. 여러 테이블의 데이터를 병합하면서 소계와 합계를 계산하려면 UNION ALL이 유일한 옵션입니다.
예시: 두 테이블의 데이터를 병합한 후 소계와 합계 계산
sql
코드 복사
SELECT Region, Product, SUM(Amount) AS TotalAmount
FROM Sales1
GROUP BY Region, Product
UNION ALL
SELECT Region, Product, SUM(Amount)
FROM Sales2
GROUP BY Region, Product
UNION ALL
SELECT 'Total', 'All Products', SUM(Amount)
FROM (
SELECT Amount FROM Sales1
UNION ALL
SELECT Amount FROM Sales2
) CombinedSales;
4. 소계/합계 데이터에 추가적인 값 포함
ROLLUP은 계산된 소계나 합계에 대해 추가 컬럼을 삽입할 수 없습니다. 추가적으로 특정 텍스트나 고정값을 포함하려면 UNION ALL을 사용해야 합니다.
예시: 소계 및 합계에 커스텀 메시지 포함
sql
코드 복사
SELECT Region, Product, SUM(Amount) AS TotalAmount, NULL AS Message
FROM Sales
GROUP BY Region, Product
UNION ALL
SELECT Region, 'Subtotal', SUM(Amount), 'This is a subtotal' AS Message
FROM Sales
GROUP BY Region
UNION ALL
SELECT 'Total', 'All Products', SUM(Amount), 'Final Total' AS Message
FROM Sales;
5. 특정 출력 순서 보장
ROLLUP은 기본적으로 그룹화 순서에 따라 소계와 합계를 생성하지만, 소계와 합계의 출력 순서를 커스터마이즈하려면 UNION ALL을 사용해야 합니다.
예시: 소계가 합계보다 항상 먼저 출력되도록 강제
sql
코드 복사
SELECT Region, Product, SUM(Amount) AS TotalAmount
FROM Sales
GROUP BY Region, Product
UNION ALL
SELECT Region, 'Subtotal', SUM(Amount)
FROM Sales
GROUP BY Region
ORDER BY
CASE
WHEN Product = 'Subtotal' THEN 1
WHEN Region = 'Total' THEN 2
ELSE 0
END;
결론
UNION ALL만 사용 가능한 상황은 다음과 같은 경우입니다:
- 특정 소계나 합계 조건이 필요할 때.
- 서로 다른 계산 로직을 결합할 때.
- 여러 테이블에서 데이터를 병합하며 소계를 계산할 때.
- 소계/합계 데이터에 커스텀 컬럼을 추가할 때.
- 출력 순서를 엄격히 제어해야 할 때.
ROLLUP으로는 제한되는 복잡한 로직이나 조건부 집계를 처리할 때 UNION ALL이 유용합니다. 하지만, 추가적인 연산 비용이 발생할 수 있으므로 성능이 중요한 경우에는 꼭 필요할 때만 사용하는 것이 좋습니다. 😊
'SQL' 카테고리의 다른 글
SQL 성능 최적화 방법과 실용적인 예시 (1) | 2024.12.06 |
---|---|
ROLLUP이 가장 빠른 이유 (0) | 2024.12.06 |
MSSQL에서 소계와 합계를 표시하는 방법 (0) | 2024.12.06 |
MSSQL에서 IF문과 CASE WHEN 차이점 알아보기 (0) | 2024.12.06 |
MSSQL에서 삽입, 수정, 삭제 구문 (0) | 2024.12.06 |