2013-05-09 34 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