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

複数の行の値を1つの行に

    ピボットは行データを取得して列名にするため、そのようにピボットする前にさらに作業を行う必要がありますが、行データはいずれも1, 2, 3, 4...ではありません。 列名として使用する(inp_value1 <-ここでは1)

    これを行うことができますが、おそらく理解しやすいでしょう:

    SELECT
      Empid,
      Ele_name,
      MAX(CASE WHEN rown = 1 THEN Inp_name END) as Inp_name1,
      MAX(CASE WHEN rown = 1 THEN Inp_value END) as Inp_Value1,
      MAX(CASE WHEN rown = 2 THEN Inp_name END) as Inp_name2,
      MAX(CASE WHEN rown = 2 THEN Inp_value END) as Inp_Value2,
      MAX(CASE WHEN rown = 3 THEN Inp_name END) as Inp_name3,
      MAX(CASE WHEN rown = 3 THEN Inp_value END) as Inp_Value3,
      MAX(CASE WHEN rown = 4 THEN Inp_name END) as Inp_name4,
      MAX(CASE WHEN rown = 4 THEN Inp_value END) as Inp_Value4,
      MAX(CASE WHEN rown = 5 THEN Inp_name END) as Inp_name5,
      MAX(CASE WHEN rown = 5 THEN Inp_value END) as Inp_Value5,
      MAX(CASE WHEN rown = 6 THEN Inp_name END) as Inp_name6,
      MAX(CASE WHEN rown = 6 THEN Inp_value END) as Inp_Value6,
      EntryId,     
      Start_date,      
      End_Date
    FROM
      (SELECT t2.*, ROW_NUMBER() OVER(PARTITION BY EmpId, Ele_name ORDER BY 1) as rown FROM t2) d
    GROUP BY 
      Empid,
      Ele_name, 
      EntryId,     
      Start_date,      
      End_Date
    
    • ps;それらがすべてnullの場合、期待される出力にname3 / 4/5/6を指定するのはなぜですか?データがempid/ele_nameのペアごとに2行を超えることは決してない場合は、null as input_name3..として書き込むことができます。 など
    • pps:テーブルをt2と呼びました-クエリに名前を編集してください
    • ppps; 「終了日」の列の名前に実際にスペースが含まれているかどうかはわかりません。アンダースコアを付けて自分の名前を呼び出しました

    または、次のようにピボットすることもできます(理解しにくいですが、よりコンパクトです):

    SELECT
      Empid,
      Ele_name,
      pvt.*,
      EntryId,     
      Start_date,      
      End_Date
    FROM
      (SELECT t2.*, ROW_NUMBER() OVER(PARTITION BY EmpId, Ele_name ORDER BY 1) as rown
       FROM t2) d
    PIVOT( 
      MAX(inp_name) as inp_name, 
      MAX(inp_value) as inp_value 
      FOR rown in (1,2,3,4,5,6) 
    ) pvt
    

    ただし、列はpvt.*から出力されます。 名前を1_inp_name、1_inp_valueとして.. ASを使用する必要があります 名前を変更するには




    1. SQL変数をPHPに返す

    2. LinuxからWindowsへのmysqlダンプ

    3. $mysqli->insert_idと同等のpostgresql

    4. テーブルフィールドにメールアドレスを挿入する