7

我目前正在开发一个具有 2 个表的系统,如下所示:

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 的方法来让我做到这一点。

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

4

1 回答 1

14

PIVOT 需要使用聚合函数来获取结果,在您的情况下,您正在使用该min函数,在您的查询中,该函数将只返回First_Setand的一个值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 |
于 2013-09-17T13:54:19.463 回答