1

次の表を想定します。

表 A:

ID  GroupName SomeValue
1   C         1
2   C         1
2   B         1
2   A         1

次の結果を選択するクエリを作成する必要があります。

ID  GroupName SomeValue
1   C         1
1   B         0
1   A         0
2   C         1
2   B         1
2   A         1

GroupName は、実際には TableA 列の CASE 式から派生し、A、B、C の 3 つの値のみを取ることができます。

分析関数は進むべき道ですか?

編集

言及していなくて申し訳ありませんが、ID は複数の列で構成されている可能性があります。次の例を検討してください。

ID1 ID2 GroupName SomeValue
1   1   C         1

1   2   C         1

2   2   C         1
2   2   B         1
2   2   A         1

SomeValue一意の ID1 + ID2 の組み合わせごとに 0 を埋め込む必要があります。したがって、結果は次のようになります。

ID1 ID2 GroupName SomeValue

1   1   C         1
1   1   B         0
1   1   A         0

1   2   C         1
1   2   B         0
1   2   A         0

2   2   C         1
2   2   B         1
2   2   A         1  

EDIT2 @Laurence
によって提案されたソリューションのように思えますが、複数列の「ID」でも機能するはずです。この要件に準拠するために、@Nicholas Krasnov によって提案されたクエリを書き直すことができませんでした。しかし、誰かがこれらのソリューションのパフォーマンスを比較できますか? analytic function「クロス結合+左外部結合」よりも高速に動作しますか?

4

2 に答える 2

3

partition byギャップを埋めるために、外部結合の句を使用して同様のクエリを作成できます。

SQL> with t1(ID,GroupName,SomeValue) as
  2  (
  3    select 1,   'C',   1  from dual union all
  4    select 2,   'C',   1  from dual union all
  5    select 2,   'B',   1  from dual union all
  6    select 2,   'A',   1  from dual
  7  ),
  8  groups(group_name) as(
  9    select 'A' from dual union all
 10    select 'B' from dual union all
 11    select 'C' from dual
 12  )
 13  select t1.ID
 14       , g.group_name
 15       , nvl(SomeValue, 0) SomeValue
 16    from t1
 17    partition by (t1.Id)
 18    right outer join groups g
 19       on (t1.GroupName = g.group_name)
 20    order by t1.ID asc, g.group_name desc
 21  ;

        ID GROUP_NAME  SOMEVALUE
---------- ---------- ----------
         1 C                   1
         1 B                   0
         1 A                   0
         2 C                   1
         2 B                   1
         2 A                   1

6 rows selected

更新: コメントへの応答。

句にもID2列を指定します。partition by

SQL> with t1(ID1, ID2, GroupName,SomeValue) as
  2  (
  3    select 1, 1, 'C', 1 from dual union all
  4    select 1, 2, 'C', 1 from dual union all
  5    select 2, 2, 'C', 1  from dual union all
  6    select 2, 2, 'B', 1  from dual union all
  7    select 2, 2, 'A', 1  from dual
  8  ),
  9  groups(group_name) as(
 10    select 'A' from dual union all
 11    select 'B' from dual union all
 12    select 'C' from dual
 13  )
 14  select t1.ID1
 15       , t1.ID2
 16       , g.group_name
 17       , nvl(SomeValue, 0) SomeValue
 18    from t1
 19    partition by (t1.Id1, t1.Id2)
 20    right outer join groups g
 21    on (t1.GroupName = g.group_name)
 22  order by t1.ID1, t1.ID2  asc , g.group_name desc
 23  ;

       ID1        ID2 GROUP_NAME  SOMEVALUE
---------- ---------- ---------- ----------
         1          1 C                   1
         1          1 B                   0
         1          1 A                   0
         1          2 C                   1
         1          2 B                   0
         1          2 A                   0
         2          2 C                   1
         2          2 B                   1
         2          2 A                   1

9 rows selected
于 2012-11-02T10:50:11.923 に答える
1
Select
  i.Id1,
  i.Id2,
  g.GroupName,
  Coalesce(a.SomeValue, 0) As SomeValue
From
  (select distinct ID1, ID2 from TableA) as i
    cross join
  (select distinct GroupName from TableA) as g
    left outer join
  tableA a
    on i.ID = a.ID and g.GroupName = a.GroupName
Order By
  1,
  2,
  3 Desc
于 2012-11-02T10:52:03.600 に答える