PIVOT行返回到返回值超过1的列

时间:2013-09-17 13:41:59

标签: sql sql-server tsql pivot

我目前正在开发一个有两个表设置的系统:

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的方法让我这样做。

是否有人建议将行转换为列然后为每列接收多个结果?

1 个答案:

答案 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;