我目前正在开发一个有两个表设置的系统:
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的方法让我这样做。
是否有人建议将行转换为列然后为每列接收多个结果?
答案 0 :(得分:13)
PIVOT需要使用聚合函数来获取结果,在您使用min
函数的情况下,在您的查询中,该函数将只返回First_Set
和{{1}的一个值}}。我建议在应用PIVOT时包含一个用于保持行不同的列。
对于您的数据,我建议使用Second_Set
为集合中的每个项目生成唯一值。然后,该值将用于PIVOT的分组方面:
row_number()
见SQL Fiddle with Demo。这将得到一个结果:
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;