0

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

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

| 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) |

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

我感谢任何人可以为此提供的任何帮助。

4

2 回答 2

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 时,至少会有一个更完整的答案,其中有不同的方法可以做到这一点。

于 2013-05-09T15:37:16.230 回答
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

于 2013-05-09T15:54:20.233 回答