具有未知数量值的SQL Developer数据透视表到一列中

时间:2013-05-09 15:27:56

标签: sql oracle pivot

我一直试图弄清楚如何在SQL Developer中使用pivot函数来处理我正在尝试的这个查询。我以前的帖子没有找到任何真正帮助我的东西所以我希望有人可以帮助我。

我需要选择的一小部分数据目前如下:

| ID | NAME | COUNTRY | STATE | DATE |  TYPE  | AMOUNT |
+----+------+---------+-------+------+--------+--------+
|  1 | John | U.S.    | TX    |  345 | Red    |     76 |
|  1 | John | U.S.    | TX    |  345 | Blue   |    357 |
|  2 | Alex | U.S.    | CO    |  654 | Red    |    231 |
|  2 | Alex | U.S.    | CO    |  654 | Black  |     90 |
|  2 | Alex | U.S.    | CO    |  654 | Blue   |    123 |
|  2 | Alex | U.S.    | CO    |  654 | Red    |    456 |
|  1 | John | U.S.    | TX    |  345 | Gold   |     60 |
|  1 | John | U.S.    | TX    |  345 | Silver |     70 |

我需要将每个不同的类型作为自己的列,以便上面的内容变为:

| ID | NAME | COUNTRY | STATE | DATE | RED | BLUE | BLACK  | OTHER  |
+----+------+---------+-------+------+-----+------+--------+--------+
|  1 | John | U.S.    | TX    |  345 |  76 |  357 | (null) | 130    |
|  2 | Alex | U.S.    | CO    |  654 | 687 |  123 | 90     | (null) |

在我的数据中,我不知道有多少'其他'颜色,或者它们都是什么(但肯定有限数量)

我感谢任何人都能为我提供帮助。

2 个答案:

答案 0 :(得分:5)

我会懒惰,并使用CASE表达式向您展示一种方法:

SELECT  ID,
        NAME,
        COUNTRY,
        STATE,
        DATE,
        SUM(CASE WHEN TYPE = 'Red' THEN AMOUNT END) RED,
        SUM(CASE WHEN TYPE = 'Blue' THEN AMOUNT END) BLUE,
        SUM(CASE WHEN TYPE = 'Black' THEN AMOUNT END) Black,
        SUM(CASE WHEN TYPE NOT IN ('Red','Blue','Black') THEN AMOUNT END) OTHER
FROM YourTable
GROUP BY ID,
         NAME,
         COUNTRY,
         STATE,
         DATE

我确信当你指定RDBMS时,会有至少一个更完整的答案,有不同的方法来做到这一点。

答案 1 :(得分:5)

您没有指定您正在使用的Oracle版本。如果您使用的是Oracle 11g,则可以使用PIVOT函数:

select *
from
(
  select id, name, country, state, "DATE", amount,
    case 
      when type in ('Red', 'Blue', 'Black') then type
      else 'Other' end type
  from yt
) 
pivot
(
  sum(amount)
  for type in ('Red', 'Blue', 'Black', 'Other')
);

请参阅SQL Fiddle with Demo