sql >> データベース >  >> RDS >> Oracle

結合して複数の列に結果を与えるSQLステートメント

    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 withDemo を参照してください。

    SQL ServerとOracleでは、PIVOT 機能が存在します:

    SQL Server

    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 withDemo を参照してください。

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

    編集、あなたは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 withDemo を参照してください。

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

    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 withDemo を参照してください。



    1. LuigiワークフローのMySQLターゲット

    2. postgres11の既存のテーブルにパーティションLISTをアタッチします

    3. ORA-06502:PL / SQL:数値または値のエラー:文字列バッファが小さすぎます-OCIインタフェースを使用して実行しています

    4. MySQLデータベース全体を削除する方法