我一直试图弄清楚如何在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) |
在我的数据中,我不知道有多少'其他'颜色,或者它们都是什么(但肯定有限数量)
我感谢任何人都能为我提供帮助。
答案 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')
);