2013-03-20 64 views
1

我有我行转成怎样我的表结构从DB2 table.This列..枢转在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 

我想这被转变为(注意,我不想转置合并)

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

位挣扎着查询,你能帮忙吗?

回答

1

这不是很漂亮,但它应该工作。 DB2没有像SQL Server一样的内置PIVOT函数。

​​3210
0

正如@bhamby所说的,DB2没有PIVOT函数。
大多数情况下,我的查询只是检索结果的方式不同 - 您需要在其上运行profiler/optimizer以确保它正确,但我相信相关的子查询可能会按行执行(可能效率较低),而不是集合。这不太可能是小数据集的问题。

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 

(...其实,我有点担心,你有两个“劝”和“不提醒”,这似乎是某种形式的布尔条件列 - 也就是说,你应该有一个,但不是其他)。

1

currently accepted answer by bhamby当然是正确的,但它是值得检查if using several correlated subqueries is much slower than a single group by(提示:最有可能的是):

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上)