여러 GROUP BY가 포함된 전체 요약
를 들어 예를들제테이름이라는 .census
다음 정보를 포함합니다.
COUNTRY PROVINCE CITY POPULATION
==============================================
USA California Sacramento 1234
USA California SanFran 4321
USA Texas Houston 1111
USA Texas Dallas 2222
Canada Ontario Ottawa 3333
Canada Manitoba Winnipeg 4444
다음과 같은 정보를 제공하는 국가/도 차원의 보고서를 작성하고 있습니다.
SELECT country, province, SUM(population)
FROM census
GROUP BY country, province;
COUNTRY PROVINCE SUM(POPULATION)
=======================================
USA California 5555
USA Texas 3333
Canada Ontario 3333
Canada Manitoba 4444
보고서에 "전체 요약" 행이 포함되어 최종 결과는 다음과 같습니다.
COUNTRY PROVINCE SUM(POPULATION)
=======================================
USA California 5555
USA Texas 3333
Canada Ontario 3333
Canada Manitoba 4444
TOTAL 16665
잘알있다니습과 아는 사이입니다.ROLLUP
가 찾는것을 수 수 것 요. s, 하만제가원것얻을을수하있다조찾는을같수니습것합없는을지는▁s다같니습것,ination▁that▁buts▁i.용사를 합니다.GROUP BY ROLLUP(country, province)
내가 원하는 총 값을 포함하지만, 내가 신경쓰지 않는 많은 추가 값도 포함됩니다.이는 다음과 같은 경우에도 해당됩니다.GROUP BY ROLLUP(country), province
어떻게 하면 "총계" 기록을 만들 수 있습니까?
저는현그계있습다니고산하로 UNION ALL
의 90를 다른 첫번쿼를리 90% 반복합니다.GROUP BY
그러나 첫 번째 쿼리가 실행되지 않기 때문에 결과는 느리고 추한 코드입니다.
이것을 가지고 놀고 싶은 사람들을 위한 SQL Fiddle이 있습니다: http://sqlfiddle.com/ #!4/12ad9/5.
이것이 바로 표현식이 수행하도록 설계된 것입니다.
SELECT country, province, SUM(population)
FROM census
GROUP BY GROUPING SETS
( (country, province), -- first group by country and province
() -- then by (nothing), i.e. a total grouping
);
SQL-Fiddle 참조
자, 드디어 두 가지 유연한 접근법을 생각해냈습니다. 제가 형편없는 프로그래머처럼 느껴지지 않게 말이죠.
첫 번째 해결책은 다음과 같습니다.
제가 본질적으로 하려고 하는 것은 두 가지 다른 수준으로 표현을 그룹화하는 것입니다. 하나는 전체 수준이고 다른 하나는 전체 수준입니다.(country, province)
레벨
만약 내가 쿼리를 두 부분으로 나누고 사용한다면,UNION ALL
반은 가지고 있을 것입니다.GROUP BY country, province
그리고 다른 하나는 그룹화 조항이 없을 것입니다.그룹화되지 않은 섹션은 다음과 같이 나타낼 수도 있습니다.GROUP BY ()
우리가 원한다면요.이것은 곧 도움이 될 것입니다.
이를 통해 다음과 같은 이점을 얻을 수 있습니다.
SELECT country, province, SUM(population)
FROM census
GROUP BY country, province
UNION ALL
SELECT NULL AS country, NULL AS province, SUM(population)
FROM census
GROUP BY ();
쿼리는 작동하지만 확장성이 좋지 않습니다.더 많은 계산이 필요할수록 반복하는 데 더 많은 시간이 소요됩니다.
를 GROUPING SETS
데이터를 두 가지 방법으로 그룹화하도록 지정할 수 있습니다.
SELECT country, province, SUM(population)
FROM census
GROUP BY GROUPING SETS( (country, province), () );
이제 우리는 어디론가 가고 있어요!하지만 우리의 결과 행은 어떻습니까?어떻게 감지하고 그에 따라 레이블을 지정할 수 있습니까?여기서 기능이 제공됩니다.GROUP BY 문 때문에 열이 NULL이면 1을 반환합니다.
SELECT
CASE
WHEN GROUPING(country) = 1 THEN 'TOTAL'
ELSE country
END AS country,
province,
SUM(population),
GROUPING(country) AS grouping_flg
FROM census
GROUP BY GROUPING SETS ( (country, province), () );
만약 우리가 그것을 좋아하지 않는다면.GROUPING SETS
접근법, 우리는 여전히 전통적이지만 약간의 변화를 가지고 사용할 수 있습니다.
을 각열 다전대신는하달로열음에 ROLLUP
개별적으로 열 집합을 괄호로 묶어서 하나의 집합으로 전달합니다.이렇게 하면 열 집합이 여러 그룹이 아닌 단일 그룹으로 처리됩니다.다음 쿼리는 이전 쿼리와 동일한 결과를 제공합니다.
SELECT
CASE
WHEN GROUPING(country) = 1 THEN 'TOTAL'
ELSE country
END AS country,
province,
SUM(population),
GROUPING(country) AS grouping_flg
FROM census
GROUP BY ROLLUP( (country, province) );
자유롭게 두 가지 방법을 사용해 보십시오!
http://sqlfiddle.com/ #!4/12ad9/102
Oracle에서는 다음과 같은 기능을 수행할 수 있습니다.having
절:
SELECT coalesce(c.country, 'Total') as province, c.country, SUM(c.population)
FROM census c
GROUP BY ROLLUP(c.country, c.province)
HAVING c.province is not null or
c.province is null and c.country is null;
여기 SQL Fiddle이 있습니다.
가장 먼저 떠오르는 것은 다음의 하위 합계를 걸러내는 것입니다.rollup
적용됨:
SELECT *
FROM (SELECT country, province, SUM (population)
FROM census
GROUP BY ROLLUP (country, province))
WHERE province IS NOT NULL OR country IS NULL;
다음을 사용하여 동일한 작업을 보다 간편하게 수행할 수 있습니다.GROUPING_ID
에서HAVING
절:
SELECT country,
province,
SUM (population)
FROM census
GROUP BY ROLLUP (country, province)
HAVING GROUPING_ID (country, province) <> 1
그리고 @Anssss가 지적했듯이, 당신은 또한 다음의 기준을 사용할 수 있습니다.WHERE
a의 첫 번째 답의 조항HAVING
절:
SELECT country, province, SUM (population)
FROM census
GROUP BY ROLLUP (country, province)
HAVING province IS NOT NULL OR country IS NULL
유니온을 사용할 수 있습니다.
SELECT country, province, SUM(population)
FROM census
GROUP BY country, province
UNION
SELECT
'Total', '', SUM(population)
FROM census
나는 유니온을 사용하여 당신의 결과 끝에 토탈을 추가하는 SQL.여기에서 쿼리를 볼 수 있습니다.
SELECT country, province, SUM(population) as population, 0 as OrderBy
FROM census
GROUP BY country, province
UNION
SELECT country, province, population, 1 as OrderBy FROM (
SELECT 'Total' as country, '' as province, SUM(population) as population
FROM census
)
ORDER BY OrderBy;
언급URL : https://stackoverflow.com/questions/25753374/overall-summary-with-multiple-group-by
'programing' 카테고리의 다른 글
WooCommerce 제품 공급업체 - 분류법 사용자 정의 필드 업데이트 (0) | 2023.07.16 |
---|---|
GitHub - gitHub 443 창에 연결하지 못함/ gitHub에 연결하지 못함 - 오류 없음 (0) | 2023.07.16 |
유형 스크립트로 Angular2 버전을 확인하는 방법 (0) | 2023.07.16 |
모델 및 관계 필드의 이름을 바꾸기 위한 장고 마이그레이션 전략 (0) | 2023.07.16 |
장고 템플릿의 사전에서 사전을 통해 반복하는 방법은 무엇입니까? (0) | 2023.07.16 |