1

行をDB2テーブルの列に転置する必要があります。これが私のテーブルの構造です。

ItemID    Item    Value
---------------------
1     Meeting     Now
1     Advise      Yes
1     NoAdvise    No
2     Meeting     Never
2     Advise      No
2     NoAdvise    Null
2     Combine    Yes

これを転置したい(Combineを転置したくないことに注意してください)

ItemID    Meeting  Advise   NoAdvise 
---------------------------------------
1         Now      Yes       No
2         Never    No        Null

クエリに少し苦労していますが、助けていただけますか?

4

3 に答える 3

3

現在受け入れられているbhambyの回答は確かに正しいですが、複数の相関サブクエリの使用が単一のグループよりもはるかに遅いかどうかを確認する価値があります(ヒント:おそらくそうです):

SELECT 
  A.ItemID,
  MAX(CASE WHEN A.Item = 'Meeting'  THEN Value END) AS Meeting,
  MAX(CASE WHEN A.Item = 'Advise'   THEN Value END) AS Advise,
  MAX(CASE WHEN A.Item = 'NoAdvise' THEN Value END) AS NoAdvise
FROM A
GROUP BY A.ItemID

私の意見ではそれも少し簡単です

SQLFiddle(PostgreSQL内ですが、DB2 LUWでも機能します)

于 2017-07-27T12:51:54.590 に答える
2

あまりきれいではありませんが、うまくいくはずです。PIVOTDB2には、 SQLServerのような組み込み関数はありません。

SELECT DISTINCT
     A.ItemID
    ,(SELECT value
      FROM table B
      WHERE B.ItemID = A.ItemID
        AND B.Item   = 'Meeting'
    ) AS Meeting
    ,(SELECT value
      FROM table B
      WHERE B.ItemID = A.ItemID
        AND B.Item   = 'Advise'
    ) AS Advise
    ,(SELECT value
      FROM table B
      WHERE B.ItemID = A.ItemID
        AND B.Item   = 'NoAdvise'
    ) AS NoAdvise
FROM table A
于 2013-03-20T18:17:22.360 に答える
0

@bhambyが言ったように、DB2には機能がありませんPIVOT
ほとんどの場合、私のクエリは結果の取得方法が異なります。確実にプロファイラー/オプティマイザーを実行する必要がありますが、相関するサブクエリは行ごとに実行される可能性があります(効率が低下する可能性があります)。セットとしてではなく。これは、小さなデータセットでは問題になる可能性はほとんどありません。

WITH Item (id) as (SELECT DISTINCT itemId
                   FROM YourTable),
SELECT item.id, Meeting.meeting, Advise.advise, NoAdvise.noadvise
FROM Item
LEFT JOIN (SELECT itemId, value as meeting
           FROM YourTable
           WHERE item = 'Meeting') as Meeting
       ON Meeting.itemId = Item.id
LEFT JOIN (SELECT itemId, value as advise
           FROM YourTable
           WHERE item = 'Advise') as Advise
       ON Advise.itemId = Item.id
LEFT JOIN (SELECT itemId, value as noadvise
           FROM YourTable
           WHERE item = 'NoAdvise') as NoAdvise
       ON NoAdvise.itemId = Item.id

(...実際、「アドバイス」と「アドバイスなし」の両方の列があるのではないかと少し心配しています。これは、ある種のブール条件のように見えます。つまり、一方は必要ですが、もう一方は必要ありません) 。

于 2013-03-20T21:46:16.823 に答える