18

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

私はROLLUPs に精通していますが、私が探しているものを得る組み合わせを見つけることができないようです. 使用GROUP BY ROLLUP(country, province)には、必要な合計値が含まれますが、気にしない多数の余分な値も含まれます。これは、GROUP BY ROLLUP(country), province

「合計」の記録を作成するにはどうすればよいですか?
現在、 で計算しUNION ALL、最初のクエリの 90% を別の で繰り返していGROUP BYますが、最初のクエリは自明ではないため、結果は遅くて醜いコードになります。

これで遊んでみたい人のための SQL Fiddle があります: http://sqlfiddle.com/#!4/12ad9/5

4

6 に答える 6

13

これはまさにGROUPING SETS式が行うように設計されたものです:

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フィドルを参照してください

于 2014-09-09T21:33:01.330 に答える
3

havingOracle では、句を使用してこれを行うことができます。

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フィドルです

于 2014-09-09T21:28:14.900 に答える
2

最初に頭に浮かぶのは、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

また、@Anssssss が指摘したように、WHERE句の最初の回答で句の基準を使用することもできますHAVING

SELECT   country, province, SUM (population)
FROM     census
GROUP BY ROLLUP (country, province)
HAVING   province IS NOT NULL OR country IS NULL
于 2014-09-09T21:01:13.537 に答える
-1

Union を使用して Total を結果の最後に追加する 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;
于 2014-09-09T21:18:55.713 に答える
-1

ユニオンを使用できます:

SELECT country, province, SUM(population)
FROM census
GROUP BY country, province
UNION
SELECT
   'Total', '', SUM(population)
FROM census
于 2014-09-09T20:58:33.227 に答える