ピボットは行データを取得して列名にするため、そのようにピボットする前にさらに作業を行う必要がありますが、行データはいずれも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
を使用する必要があります 名前を変更するには