2015-03-05 1 views
1

, когда я использую следующий запрос я получаю ORA-00933 ВЭ ошибкиORA-00933: команда SQL не правильно закончилась, используя стержень

SELECT * FROM sales PIVOT (sum(quantity) FOR color IN ('WHITE','DARK')); 

Вот мое описание таблицы выглядит следующим образом:

CREATE TABLE SALES(
ITEM_NAME CHAR(20) NOT NULL, 
COLOR CHAR(20) NOT NULL, 
CLOTHES_SIZE CHAR(10) NOT NULL, 
QUANTITY INTEGER NOT NULL 
); 

и тестовые данные:

SKIRT DARK SMALL 2 
SKIRT DARK MEDIUM 5 
SKIRT DARK LARGE 1 
SKIRT PASTEL SMALL 11 
SKIRT PASTEL MEDIUM 9 
SKIRT PASTEL LARGE 15 
SKIRT WHITE SMALL 2 
SKIRT WHITE MEDIUM 5 
SKIRT WHITE LARGE 3 
DRESS DARK SMALL 2 
DRESS DARK MEDIUM 6 
DRESS DARK LARGE 12 
DRESS PASTEL SMALL 4 
DRESS PASTEL MEDIUM 3 
DRESS PASTEL LARGE 3 
DRESS WHITE SMALL 2 
DRESS WHITE MEDIUM 3 
DRESS WHITE LARGE 0 
SHIRTS DARK SMALL 2 
SHIRTS DARK MEDIUM 6 
SHIRTS DARK LARGE 6 
SHIRTS PASTEL SMALL 4 
SHIRTS PASTEL MEDIUM 1 
SHIRTS PASTEL LARGE 2 
SHIRTS WHITE SMALL 17 
SHIRTS WHITE MEDIUM 1 
SHIRTS WHITE LARGE 10 
PANTS DARK SMALL 14 
PANTS DARK MEDIUM 6 
PANTS DARK LARGE 0 
PANTS PASTEL SMALL 1 
PANTS PASTEL MEDIUM 0 
PANTS PASTEL LARGE 1 
PANTS WHITE SMALL 3 
PANTS WHITE MEDIUM 0 
PANTS WHITE LARGE 2 
+0

Какую версию Oracle вы используете? –

ответ

1

The PIVOT operator was introduced in Oracle 11gR1. Ваш запрос отлично работает в этой версии или позже. В более ранних версиях вы получите эту ошибку:

SQL> SELECT * FROM sales PIVOT (sum(quantity) FOR color IN ('WHITE','DARK')); 
SELECT * FROM sales PIVOT (sum(quantity) FOR color IN ('WHITE','DARK')) 
          * 
ERROR at line 1: 
ORA-00933: SQL command not properly ended 

Таким образом, вы, похоже, не используете версию, поддерживающую оператора. В более ранних версиях вы можете выполнить одну и ту же задачу вручную с помощью агрегатов и операторов case:

select item_name, clothes_size, 
    sum(case when color = 'WHITE' then quantity end) as white, 
    sum(case when color = 'DARK' then quantity end) as dark 
from sales 
group by item_name, clothes_size 
order by item_name, clothes_size; 
+0

Действительно. Синтаксис Pivot выглядит мне понятным. – mmmmmpie

0

Я думаю, вам нужно использовать подзапрос с шарниром, например:

SELECT * FROM (
    select * from sales 
) 
PIVOT 
(
    sum(quantity) 
    FOR color IN ('WHITE','DARK') 
); 

Источники: http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#CHDCEJJE

+0

Запрос OP работает так же, как и в 11gR2, потому что он использует 'select *' в любом случае; но если он выбирал подмножество столбцов, тогда он должен был иметь подзапрос. (И это должно быть действительно указание столбцов, использование 'select *' - это не очень хорошая идея). Но, вероятно, лучше быть последовательным и всегда использовать подзапрос. Это не вызывает ошибки. –

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