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

use*_*103 7 sql t-sql sql-server pivot

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

Table_1
-------
ID
Table2ID
Value



Table_2
--------
ID
ColumnName
Run Code Online (Sandbox Code Playgroud)

每个表的一些模拟结果:

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
Run Code Online (Sandbox Code Playgroud)

所以,我有以下查询,试图将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
Run Code Online (Sandbox Code Playgroud)

问题在于,正如它所写,我得到了一个结果.我的返回值将是这样的:

    First_Set  |  Second_Set
    -------------------------
    ABCD       |  MNOP
Run Code Online (Sandbox Code Playgroud)

我想要的是每列的所有结果,但是我还没有找到使用PIVOT的方法让我这样做.

有没有人有关于将行转换为列然后为每列接收多个结果的最佳方法的建议?

Tar*_*ryn 13

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;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.这将得到一个结果:

| FIRST_SET | SECOND_SET |
|      ABCD |       MNOP |
|      EFGH |       QRST |
|      IJKL |       UVWX |
Run Code Online (Sandbox Code Playgroud)