-2

誰かが次の結果を生成するためのSQLステートメントを手伝ってくれますか?

Table Person
Person_ID  Name
1          John
2          Paul

Table Declaration
Decl_ID             Person_ID   Amount
1                   1               10
2                   2               12
3                   1               99
4                   1               24

SQLステートメントの結果は次のようになります。

Name    Amount1 Amount2 Amount3
John    10      99      24
Paul    12
4

2 に答える 2

2

RDBMS を指定しませんでしたが、これは基本的に、pivotデータベースがその機能にアクセスできる場合です。そうでない場合は、case集計関数を使用して複製できます。

MySQL :

select name,
  sum(case when group_rn = 1 then amount else 0 end) Amount1,
  sum(case when group_rn = 2 then amount else 0 end) Amount2,
  sum(case when group_rn = 3 then amount else 0 end) Amount3
from
(
  select name,
    @num := if(@name = `name`, @num + 1, 1) as group_rn,
    @name := `name` as dummy,
    amount
  from
  (
    select p.name,
      d.amount,
      d.decl_id
    from person p
    inner join declaration d
      on p.person_id = d.person_id
  ) src
  order by name
) p
group by name

デモで SQL Fiddle を参照してください

SQL Server と Oracle には次のPIVOT関数が存在します。

SQL サーバー:

select name,
  [1] as Amount1,
  [2] as Amount2,
  [3] as Amount3
from
(
  select p.name,
    d.amount,
    row_number() over(partition by p.name order by d.amount) rn
  from person p
  inner join declaration d
    on p.person_id = d.person_id
) src
pivot
(
  sum(amount)
  for rn in ([1], [2], [3])
) p

デモで SQL Fiddle を参照してください

列に変換する金額が不明な場合は、動的バージョンを作成できます。

編集、Oracleを使用していると述べたので、Oracle固有の回答は以下のとおりです。

Oracle 11g には次のpivot機能があります。

select name,
  Amount1,
  Amount2,
  Amount3
from
(
  select p.name,
    d.amount,
    row_number() over(partition by p.name order by d.amount) rn
  from person p
  inner join declaration d
    on p.person_id = d.person_id
) src
pivot
(
  sum(amount)
  for rn in ('1' as Amount1, '2' as Amount2, '3' as Amount3)
) p

デモで SQL Fiddle を参照してください

Oracle 11g を使用していない場合は、CASEwith 集計関数を使用する必要があります。

select name,
  sum(case when rn = 1 then amount else 0 end) Amount1,
  sum(case when rn = 2 then amount else 0 end) Amount2,
  sum(case when rn = 3 then amount else 0 end) Amount3
from
(
  select p.name,
    d.amount,
    row_number() over(partition by p.name order by d.amount) rn
  from person p
  inner join declaration d
    on p.person_id = d.person_id
) src
group by name

デモで SQL Fiddle を参照してください

于 2012-10-31T14:33:56.940 に答える
0

あなたが探しているのは動的なピボットだと思います。問題は、動的なピボットが必要な場合、クエリを文字列として実行する必要があることです。

例を見つけてください: http://www.sqlhub.com/2009/05/generic-stored-procedure-for-pivot-in.html

于 2012-10-31T14:48:38.447 に答える