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

前端之家收集整理的这篇文章主要介绍了sql – PIVOT行返回到返回值超过1的列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在开发一个有两个表设置的系统:
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 |

猜你在找的MsSQL相关文章