2016-11-15 30 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