T-SQL:将逻辑结构表显示为平面输出

时间:2014-03-19 11:37:01

标签: sql sql-server join

我有一张表,T1,带有ID和其他一些字段。

我有另一个表T2,它带有一个ID(与第一个表中的ID匹配),一个sort_order和一个值。 ID和订单是复合主键。

对于我的输出,我需要有一行ID,然后是value1,value2,value3 ... value * n * (实际上我将在12点停止)

我可以通过多次将T2连接到T1来实现这一点:

SELECT T1.ID, T1.[Other fields], T2_1.Value AS Value1, T2_2.Value AS Value2 ...
FROM T1 
LEFT JOIN T2 AS T2_1 ON T1.ID = T2_1.ID AND 1 = T2_1.Sort_Order
LEFT JOIN T2 AS T2_2 ON T1.ID = T2_2.ID AND 2 = T2_1.Sort_Order
...

但我想知道是否有更好的方法?或者至少有一个看起来更整洁!

SQL版本是2008年。

感谢。

2 个答案:

答案 0 :(得分:0)

我的第一个想法是条件聚合:

SELECT T1.ID, T1.[Other fields],
       MAX(CASE WHEN T2.Sort_Order = 1 then T2.Value END) AS Value1,
       MAX(CASE WHEN T2.Sort_Order = 2 then T2.Value END) AS Value2,
       MAX(CASE WHEN T2.Sort_Order = 3 then T2.Value END) AS Value3,
       . . .
FROM T1  LEFT JOIN
     T2 T2
     ON T1.ID = T2_1.ID
GROUP BY t1.ID, T1.[Other fields];

答案 1 :(得分:0)

在SQL服务器上,PIVOT是您正在寻找的关键字!

查询:

SELECT ID, [Other fields], [1], [2], [3], [4], . . .
FROM (
    SELECT T1.ID, T1.[Other fields], T2.Sort_Order, T2.Value) 
    FROM T1 INNER JOIN T2 ON T1.ID = T2.ID
) AS SourceTable
PIVOT (
    MAX(Value)
    FOR Sort_Order IN ([1], [2], [3], [4], . . .)
) AS PivotTable

查看BOL以获取更多信息:http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

使用动态sql,还可以动态生成列列表,因此您不必将自己限制为固定数量的值。例如,请参阅:T-SQL Pivot? Possibility of creating table columns from row values