2016-11-15 34 views
0

需要使用SQL將TBL1轉換爲TBL2。按類別劃分的SQL行轉換爲列標題

TBL1

 Type SubType Value 
    ---- ------- ----- 
    100 100  A 
    100 200  B 
    200 100  A 
    200 200  C 
    300 100  A 
    300 300  D 
    400 100  A 
    400 300  E 

TBL2

 Type v100 v200 V300 
    ---- ---- ---- ---- 
    100 A B 
    200 A C 
    300 A  D 
    400 A  E 

我怎樣才能得到一個新表與不同類型的每一行中的所有亞型列標題和價值屬於Type的子類型。

我使用Excel和ODBC發送一個查詢字符串DB2服務器

回答

2

不知道哪個平臺都在討論SQL-服務器,Oracle,MySQL的,等等?我可以給你唯一的答案就是Conditional Aggregation

SELECT 
    Type 
    ,MAX(CASE WHEN SubType = 100 THEN Value END) as v100 
    ,MAX(CASE WHEN SubType = 200 THEN Value END) as v200 
    ,MAX(CASE WHEN SubType = 300 THEN Value END) as v300 
FROM 
    Tbl1 
GROUP BY 
    Type 
+0

我正在使用Excel和ODBC發送一個曲線到DB2服務器的字符串。 – Jorge

2

你可以使用一個自連接

select t1.Type, t1.Value as v100, t2.Value as v200, t3.Value as v300 
from my_table as t1 
left join my_table as t2 on t1.Type = T2.Type and T2.SubType = 200 
left join my_table as t3 on t1.Type = T3.Type and T3.SubType = 300  
where t1.Subtype = 100 
+0

你可以通過連接來實現,儘管思考條件聚合會明顯地影響它的性能......但是這個查詢不會產生所需的結果,因爲不是每個類型都有一個200或300的子類型。如果由於某種原因輸入100曾經失蹤,這也是一個問題。你需要一個不同的t1.type派生表,然後左加入 – Matt

+1

@Matt正確..是的。左連接不在內。謝謝..答案更新.. .. upvote爲您的禮貌和(好的答案) – scaisEdge

2

這是馬特的答案的動態版本:

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql = 
'SELECT 
    Type' + CHAR(10) + 
    STUFF((
     SELECT DISTINCT 
      ' ,MAX(CASE WHEN SubType = ' + CONVERT(VARCHAR(10), Subtype) + ' THEN Value END) AS ' 
       + QUOTENAME('v'+ CONVERT(VARCHAR(10), SubType)) + CHAR(10) 
     FROM Tbl 
     FOR XML PATH('') 
    ), 1, 0, '') + 
'FROM Tbl 
GROUP BY Type;'; 

PRINT @sql; 
EXEC sp_executesql @sql; 

這是for SQL-Server

+0

我使用Excel和ODBC發送查詢字符串到DB2服務器 – Jorge