2014-09-26 3 views
0

Я знаю, что это была тема здесь раньше, но у меня все еще возникают проблемы с группировкой внутри профсоюзов. Я смотрел здесь: Grouping and Joining a Unioned Table. Having Problems среди других и до сих пор смущен относительно того, что делать со скобкой. Вот мой код:Проблемы с объединением и группировкой

SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     sum(sm.CT_REGULAR_HOURS)"Reg Hours", 
     sum(sm.CT_PREMIUM_HOURS)"OT Hours" 
    FROM 
    (
    SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     sm.CT_REGULAR_HOURS"Reg Hours", 
     sm.CT_PREMIUM_HOURS"OT Hours" 
    FROM 
     SA_WORK_ORDER W, 
     SA_WORK_ORDER_TASK WT, 
     SA_SERVICE_HISTORY_DETAILS SD, 
     SA_SERVICE_HISTORY_DETAILS SD2, 
     SA_SERVICE_HISTORY_DETAILS SD3, 
     SA_SERVICE_HISTORY_DETAILS SD4, 
     smu_transactions sm 
    WHERE 
     SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND W.WORK_ORDER_NO   = WT.WORK_ORDER_NO 
    AND 
     (
     WT.WORK_ORDER_NO  = SD.WORK_ORDER_NO 
     AND WT.WORK_ORDER_TASK_NO = SD.WORK_ORDER_TASK_NO 
    ) 
    AND 
     (
     sd.work_order_no  = sd2.work_order_no 
     AND sd.work_order_task_no = sd2.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd3.work_order_no 
     AND sd.work_order_task_no = sd3.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd4.work_order_no 
     AND sd.work_order_task_no = sd4.work_order_task_no 
    ) 
    AND SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd.attribute_desc   = 'Type of Outage' 
    AND SD2.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd2.attribute_desc   = 'Total Time Water Off' 
    AND SD3.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd3.attribute_desc   = 'Number of Homes affected' 
    AND SD4.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd4.attribute_desc   = 'Number of Businesses affected' 
    AND WT.TASK_STATUS   != 'CANCELED' 
    AND sm.transaction_type  = 'CT' 

    UNION ALL 

    SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     SUM(sm.CT_REGULAR_HOURS)"Reg Hours", 
     SUM(sm.CT_PREMIUM_HOURS)"OT Hours" 
    FROM 
    ( SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     sm.CT_REGULAR_HOURS"Reg Hours", 
     sm.CT_PREMIUM_HOURS"OT Hours" 
    FROM 
     SA_WORK_HISTORY W, 
     SA_WORK_HISTORY_TASK WT, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD2, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD3, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD4, 
     smu_transactions sm 
    WHERE 
     SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND W.WORK_ORDER_NO   = WT.WORK_ORDER_NO 
    AND 
     (
     WT.WORK_ORDER_NO  = SD.WORK_ORDER_NO 
     AND WT.WORK_ORDER_TASK_NO = SD.WORK_ORDER_TASK_NO 
    ) 
    AND 
     (
     sd.work_order_no  = sd2.work_order_no 
     AND sd.work_order_task_no = sd2.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd3.work_order_no 
     AND sd.work_order_task_no = sd3.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd4.work_order_no 
     AND sd.work_order_task_no = sd4.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sm.WORK_ORDER_NO 
     AND sd.work_order_task_no = sm.work_order_task_no 
    ) 
    AND SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd.attribute_desc   = 'Type of Outage' 
    AND SD2.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd2.attribute_desc   = 'Total Time Water Off' 
    AND SD3.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd3.attribute_desc   = 'Number of Homes affected' 
    AND SD4.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd4.attribute_desc   = 'Number of Businesses affected' 
    AND WT.TASK_STATUS   != 'CANCELED' 
    AND sm.transaction_type  = 'CT' 
    ) 
    GROUP BY 
     sm.CT_REGULAR_HOURS, 
     sm.CT_PREMIUM_HOURS 
     ORDER BY 
     sd.work_order_no, 
     sd.WORK_ORDER_TASK_NO; 

Ошибка: ORA-00907: отсутствует правая скобка 00907. 00000 - "отсутствует правая скобка" * Причина:
* Действие: Ошибка в строке: 152 Колонка : 23

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

TIA за любую помощь, которую вы можете дать!

+0

У вас должна быть конечная скобка перед 'UNION ALL'. После того, как вы исправите это, вам понадобится ссылка на столбцы (ссылаясь на псевдонимы, которые заключены в производную таблицу). –

+0

Спасибо Патрику, указав столбцы, о которых вы говорите о концевой группе, и заказываете? – robartle

+0

Например, 'W.WORK_ORDER_NO' (блок запроса один) должен либо иметь префикс имени производной таблицы, из которой она исходит (но вы ее не присвоили), либо без какой-либо квалификации (потому что все происходит от вашего производная таблица). –

ответ

1

Я упростил ваш запрос, чтобы прийти к этому псевдо запросу и отсутствующая парантеза была сразу очевидна.

SELECT 
    set_of_rows 
FROM 
(
SELECT 
set_of_rows 
FROM 
    set_of_tables 
WHERE 
    set_of_conditions) //You missed this closing paranthesis 
        ^
UNION ALL 

SELECT 
    set_of_rows 
FROM 
( SELECT 
    set_of_rows 
FROM 
    set_of_tables 
WHERE 
    set_of_conditions 
) 
GROUP BY 
    some_rows 
ORDER BY 
    some_other_rows 
1

Я не уверен, что вы действительно хотите, но были некоторые ошибки, о группировке по а также я добавил новый правая скобка, фиксированный запрос:

SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     sum(sm.CT_REGULAR_HOURS)"Reg Hours", 
     sum(sm.CT_PREMIUM_HOURS)"OT Hours" 
    FROM 
    (
    SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     sm.CT_REGULAR_HOURS"Reg Hours", 
     sm.CT_PREMIUM_HOURS"OT Hours" 
    FROM 
     SA_WORK_ORDER W, 
     SA_WORK_ORDER_TASK WT, 
     SA_SERVICE_HISTORY_DETAILS SD, 
     SA_SERVICE_HISTORY_DETAILS SD2, 
     SA_SERVICE_HISTORY_DETAILS SD3, 
     SA_SERVICE_HISTORY_DETAILS SD4, 
     smu_transactions sm 
    WHERE 
     SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND W.WORK_ORDER_NO   = WT.WORK_ORDER_NO 
    AND 
     (
     WT.WORK_ORDER_NO  = SD.WORK_ORDER_NO 
     AND WT.WORK_ORDER_TASK_NO = SD.WORK_ORDER_TASK_NO 
    ) 
    AND 
     (
     sd.work_order_no  = sd2.work_order_no 
     AND sd.work_order_task_no = sd2.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd3.work_order_no 
     AND sd.work_order_task_no = sd3.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd4.work_order_no 
     AND sd.work_order_task_no = sd4.work_order_task_no 
    ) 
    AND SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd.attribute_desc   = 'Type of Outage' 
    AND SD2.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd2.attribute_desc   = 'Total Time Water Off' 
    AND SD3.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd3.attribute_desc   = 'Number of Homes affected' 
    AND SD4.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd4.attribute_desc   = 'Number of Businesses affected' 
    AND WT.TASK_STATUS   != 'CANCELED' 
    AND sm.transaction_type  = 'CT' 
    ) 
    group by 
    W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value 

    UNION ALL 

    SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     SUM(sm.CT_REGULAR_HOURS)"Reg Hours", 
     SUM(sm.CT_PREMIUM_HOURS)"OT Hours" 
    FROM 
    ( SELECT 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value"Businesses Affected", 
     sm.CT_REGULAR_HOURS"Reg Hours", 
     sm.CT_PREMIUM_HOURS"OT Hours" 
    FROM 
     SA_WORK_HISTORY W, 
     SA_WORK_HISTORY_TASK WT, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD2, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD3, 
     SA_WORK_HISTORY_SERVICE_DETAIL SD4, 
     smu_transactions sm 
    WHERE 
     SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND W.WORK_ORDER_NO   = WT.WORK_ORDER_NO 
    AND 
     (
     WT.WORK_ORDER_NO  = SD.WORK_ORDER_NO 
     AND WT.WORK_ORDER_TASK_NO = SD.WORK_ORDER_TASK_NO 
    ) 
    AND 
     (
     sd.work_order_no  = sd2.work_order_no 
     AND sd.work_order_task_no = sd2.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd3.work_order_no 
     AND sd.work_order_task_no = sd3.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sd4.work_order_no 
     AND sd.work_order_task_no = sd4.work_order_task_no 
    ) 
    AND 
     (
     sd.work_order_no  = sm.WORK_ORDER_NO 
     AND sd.work_order_task_no = sm.work_order_task_no 
    ) 
    AND SD.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd.attribute_desc   = 'Type of Outage' 
    AND SD2.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd2.attribute_desc   = 'Total Time Water Off' 
    AND SD3.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd3.attribute_desc   = 'Number of Homes affected' 
    AND SD4.SPECIFICATION_CATEGORY = 'WATER OUTAGE' 
    AND sd4.attribute_desc   = 'Number of Businesses affected' 
    AND WT.TASK_STATUS   != 'CANCELED' 
    AND sm.transaction_type  = 'CT' 
    ) 
    GROUP BY 
     W.WORK_ORDER_NO, 
     W.WORK_CLASS, 
     SD.WORK_ORDER_TASK_NO, 
     sd.ATTRIBUTE_VALUE"Outage Type", 
     sd2.attribute_value"Total Time Water Off", 
     WT.TASK_STATUS, 
     wt.area, 
     wt.creation_date, 
     sd3.attribute_value"Homes Affected", 
     sd4.attribute_value 
     ORDER BY 11, 12; 
Смежные вопросы