以下の例のクエリ Q1 のように、インターネット上には多くのグループ化セットの例があります。ただし、A2 はグループ化列であり、SUM() の引数として使用されるため、クエリ Q2 は異なります。
SQL 標準 (任意のバージョン) に従って、第 2 四半期について正しいものはどれですか?2003年以降グループ化セットをサポートする)? (1)が正しい場合、基準を参照して理由を説明してください。
A2 は、集計の引数に含まれていない限り、NULL に置き換えられます。この解釈により、以下の結果 R1 が得られます。これは Oracle の動作です (こちらの方が便利なようです)。
A2 は、集計で使用されている場所を含めて NULL に置き換えられます。これは、集計が NULL を返すことを意味します。この解釈により、以下の結果 R2 が得られます。これが私がSQL標準を理解している方法です(おそらく間違っています)。
コード例:
-- Setup
create table A (A1 int, A2 int, A3 int);
insert into A values (1, 1, 100);
insert into A values (1, 2, 40);
insert into A values (2, 1, 70);
insert into A values (5, 1, 90);
-- Query Q1
-- Expected/Observed results:
--
-- A1 A2 SUM(A3)
-- ---------- ---------- ----------
-- 1 - 140
-- 2 - 70
-- 5 - 90
-- - 1 260
-- - 2 40
-- - - 300
select A1, A2, sum (A3)
from A
group by grouping sets ((A1), (A2), ())
order by 1, 2;
-- Query Q2
-- Results R1 (Oracle):
-- A1 A2 SUM(A2)
-- ---------- ---------- ----------
-- 1 - 3
-- 2 - 1
-- 5 - 1
-- - 1 3
-- - 2 2
-- - - 5
--
-- Results R2 (SQL Standard?):
-- A1 A2 SUM(A2)
-- ---------- ---------- ----------
-- 1 - -
-- 2 - -
-- 5 - -
-- - 1 3
-- - 2 2
-- - - - -- NULL row
select A1, A2, sum (A2)
from A
group by grouping sets ((A1), (A2), ())
order by 1, 2;
これは、SQL 2003 7.9 構文 17 で認識されており、列が NULL に置き換えられる方法が記述されています。ただし、集約への引数を除外する他の場所でのルールを見逃したり、誤解したりする可能性があります。
m) For each GS_i:
iii) Case:
1) If GS_i is an <ordinary grouping set>, then
A) Transform SL2 to obtain SL3, and transform HC to obtain
HC3, as follows:
II) Replace each <column reference> in SL2 and HC that
references PC_k by "CAST(NULL AS DTPCk)"