加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 07:48:38 所属栏目:MsSql教程 来源:网络整理
导读:我目前正在开发一个有两个表设置的系统: Table_1-------IDTable2IDValueTable_2--------IDColumnName 每个表的一些模拟结果: Table_1Table2ID | Value---------------1 | ABCD1 | EFGH1 | IJKL2 | MNOP2 | QRST2 | UVWXTable_2ID | ColumnName-------------
我目前正在开发一个有两个表设置的系统:
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 |

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读