我有一张表,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年。
感谢。
答案 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