2013-05-09 36 views
0

我一直在试图弄清楚如何使用SQL Developer中的pivot函数来处理这一个查询。我从以前的帖子中找不到任何真正帮助我的东西,所以我希望有人能帮助我。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) | 

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

我很感谢任何人都可以提供的帮助我与此。

+0

请注明您是通过添加合适的标签(甲骨文,SQL服务器,MySQL和等针对RDBMS )。可能会有利用不被普遍支持的语言或产品功能的答案。此外,通过使用特定的RDBMS标记它,您的问题可能会得到更适合回答的人的关注。 – Taryn 2013-05-09 15:34:18

+0

你有多少数据?如果只有几个1000s,那么在excel中执行起来可能会更容易... – Aprillion 2013-05-09 15:36:57

+0

(** 1 **)对于每个名称,“DATE”值是一致的巧合吗? (** 2 **)您想为所有未明确列出的颜色选择**单个**“OTHER”列,对吗? – 2013-05-09 15:42:02

回答

5

您没有指定您正在使用的Oracle版本。如果您使用的是Oracle 11g,那么你可以使用旋转功能:

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

+0

我正在使用Oracle3。你的透视函数方法似乎是非常有效的,但不幸的是不适合我。但是谢谢你! – DrNerj 2013-05-09 16:20:17

+4

@DrNerj没办法!您无法运行Oracle 3!甲骨文三家公司在81年问世。其中最大的特点就是可持续交易。你的ORACLE版本是30岁的先生。我认为是时候升级了。 – Zane 2013-05-09 16:34:06

+0

DrNerj很可能意味着SQL * Developer 3(当前的主要修订版)。 – Ben 2013-05-09 21:51:02

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,将​​有至少一个更完整的答案不同的方式来做到这一点。

+0

我会建议'总和'作为总和。这是一个演示 - http://www.sqlfiddle.com/#!2/d08d1/4 – Taryn 2013-05-09 15:38:21

+0

@bluefeet我想过,但决定假设每种类型只有一行。现在意识到它不适用于“OTHER”列。我是一个白痴,但仍然在等待更新他的问题,所以我可以看到你更完整的答案:-) – Lamak 2013-05-09 15:39:58

+0

@Lamak非常感谢你,这是非常有益的。该方法似乎工作得很好。我会upvote您的帖子,但我没有足够的声誉这样做。 – DrNerj 2013-05-09 16:13:09