programing

여러 GROUP BY가 포함된 전체 요약

starjava 2023. 7. 16. 12:26
반응형

여러 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가 지적했듯이, 당신은 또한 다음의 기준을 사용할 수 있습니다.WHEREa의 첫 번째 답의 조항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

반응형