Oracle - есть ли способ написать этот запрос в одном операторе Select? - PullRequest
2 голосов
/ 07 ноября 2011

У меня следующий запрос:

SELECT * FROM (
    SELECT * FROM View_ExecutiveForecastReport
    WHERE WORKGROUPID IN (94)
)
PIVOT  (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))

Я хотел бы вместо этого написать его, используя один SELECT вместо вложенности.Я пытался:

SELECT * FROM View_ExecutiveForecastReport
WHERE WORKGROUPID IN (94)
PIVOT  (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))

Но я получаю сообщение об ошибке: ORA-00933: команда SQL неправильно завершена

Я также пытался:

SELECT * FROM View_ExecutiveForecastReport
PIVOT  (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))
WHERE WORKGROUPID IN (94)

Что выдает ошибку: ORA-00904: "WORKGROUPID": неверный идентификатор

Если я удаляю предложение WHERE, запрос работает нормально.Я также открыт для решений, которые используют CTE.

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Я решил также опубликовать версию рабочего запроса CTE, хотя я не знаю, дает ли это какие-либо преимущества по сравнению с моим исходным рабочим запросом.

WITH V AS (SELECT * FROM View_ExecutiveForecastReport WHERE WORKGROUPID IN (94))
    SELECT * FROM V
    PIVOT  (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
    94 as "B2B",
    66 as "CFS",
    69 as "800IB",
    76 as "TSData",
    99 as "RetailSales",
    103 as "Telesales"
    ))
1 голос
/ 08 ноября 2011

Это не будет работать, потому что PIVOT является частью table_reference части предложения FROM table_reference , вот почему это работает:

SELECT * FROM View_ExecutiveForecastReport
PIVOT  (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))

Поскольку рабочая группа не возвращается какстолбец в преобразовании PIVOT, вы не можете использовать его в предложении WHERE.Использование SELECT * FROM (подзапрос) PIVOT довольно распространено, поэтому я предлагаю вам его использовать.

...