2013-05-09 2 views
0

Я пытаюсь выяснить, как использовать опорную функцию в SQL Developer для этого одного запроса, который я пытаюсь сделать. Я не нашел ничего, чтобы действительно помочь мне с предыдущих сообщений, поэтому я надеялся, что кто-то сможет мне помочь.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

Пожалуйста, укажите RDBMS, что вы ориентируетесь, добавив соответствующий тег (Oracle, SQL Server, MySQL и т.д.). Могут быть ответы, которые используют преимущества языка или функций продукта, которые не поддерживаются повсеместно. Кроме того, пометив его конкретными СУБД, ваш вопрос может привлечь внимание от людей, более подходящих для ответа на него. – Taryn

+0

сколько у вас данных? это может быть проще сделать в excel, если только несколько тысяч ... – Aprillion

+0

(** 1 **) Совместимо ли значение 'DATE' для каждого имени? (** 2 **) Вы хотите использовать ** одиночный ** «ДРУГОЙ» столбец для всех цветов, которые вы явно не указали, не так ли? –

ответ

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

+0

Я использую Oracle3. Ваш метод функции поворота кажется, что он будет очень эффективным, но, к сожалению, не работает для меня. Но спасибо! – DrNerj

+4

@DrNerj никак! Вы не используете Oracle 3! Oracle три вышел в 81 году. Большая особенность для этого - Commitable Transactions. Ваша версия ORACLE 30 лет сэр. Я думаю, что пришло время обновиться. – Zane

+0

Скорее всего, DrNerj означал SQL * Developer 3 (текущая основная ревизия). – Ben

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

Я бы предложил 'sum' как совокупность. Вот демонстрация - http://www.sqlfiddle.com/#!2/d08d1/4 – Taryn

+0

@bluefeet Я подумал об этом, но решил предположить, что для каждого типа было только одна строка. И теперь понял, что он не будет работать для столбца «OTHER». Я идиот, но все еще жду op, чтобы обновить его вопрос, чтобы я мог видеть ваш более полный ответ :-) – Lamak

+0

@Lamak Большое спасибо, это было очень полезно. Этот метод работает очень хорошо. Я бы поднял ваш пост, но у меня нет достаточной репутации, чтобы сделать это. – DrNerj

Смежные вопросы