我目前正在开发一个有两个表设置的系统:
Table_1 ------- ID Table2ID Value Table_2 -------- ID ColumnName
每个表的一些模拟结果:
Table_1 Table2ID | Value --------------- 1 | ABCD 1 | EFGH 1 | IJKL 2 | MNOP 2 | QRST 2 | UVWX Table_2 ID | ColumnName -------------------- 1 | First_Set 2 | Second_Set
所以,我有以下查询,试图将Table_2的行结果转换为列
SELECT * FROM( SELECT B.ColumnName,A.Value FROM Table_1 AS A INNER JOIN Table_2 AS B ON A.Table2ID = B.ID ) AS P PIVOT ( min(P.Value) for P.ColumnName in ([First_Set],[Second_Set]) ) AS PIV
问题在于,正如它所写,我得到了一个结果.我的返回值将是这样的:
First_Set | Second_Set ------------------------- ABCD | MNOP
我想要的是每列的所有结果,但是我还没有找到使用PIVOT的方法让我这样做.
有没有人有关于将行转换为列然后为每列接收多个结果的最佳方法的建议?
解决方法
PIVOT需要使用聚合函数来获取结果,在您使用min函数的情况下,在您的查询中,它将仅返回First_Set和Second_Set的一个值.我建议在应用PIVOT时包含一个用于保持行不同的列.
对于您的数据,我建议使用row_number()为集合中的每个项目生成唯一值.然后,该值将用于PIVOT的分组方面:
SELECT [First_Set],[Second_Set] FROM ( SELECT B.ColumnName,A.Value,row_number() over(partition by a.Table2ID order by a.Value) seq FROM Table_1 AS A INNER JOIN Table_2 AS B ON A.Table2ID = B.ID ) AS P PIVOT ( min(P.Value) for P.ColumnName in ([First_Set],[Second_Set]) ) AS PIV;
见SQL Fiddle with Demo.这将给出一个结果:
| FIRST_SET | SECOND_SET | | ABCD | MNOP | | EFGH | QRST | | IJKL | UVWX |