【问题标题】:Trouble with union and grouping联合和分组问题
【发布时间】:2014-09-26 14:19:53
【问题描述】:

我知道这曾经是这里的一个话题,但我仍然无法在工会中进行分组。我看过这里: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 为您提供任何帮助!

【问题讨论】:

  • UNION ALL 之前需要有一个结束括号。解决此问题后,您对列的引用需要工作(引用封装在派生表中的别名)。
  • 谢谢帕特里克,通过引用您所说的结束组和排序的列?
  • 例如,W.WORK_ORDER_NO(查询块一),应该以它来自的派生表的名称作为前缀(但您没有分配一个)或没有限定(因为一切都来自您的派生表)。
  • 顺便说一句,帮自己一个忙,使用检测这些配对的工具(例如好的文本编辑器)或开发工具。

标签: sql oracle


【解决方案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

【讨论】:

    【解决方案2】:

    我不确定你真正想要什么,但是关于分组有一些错误,我还添加了一个新的右括号,修复了查询:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多