(3504) 尝试在 teradata 中生成总和时出错?

(3504) error trying to generate a sum in teradata?

我正在尝试修改生成未来工作预测的查询以总结分配给某些交易的工作量,但是当我添加 SUM() 函数时,我总是收到 3504 错误。但是我不确定我错过了什么?

编辑:包括 group by 和 select,不确定他们为什么不首先复制...

注意:WS.ActivityEstimatedHours 的列类型是十进制

SELECT
        WO.WorkOrderCodeBK AS "WORKORDER",
        WO.WorkOrderPMCodeBK AS "PM",
        WO.WorkOrderDescription AS "DESCRIPTION",
        NULL AS "COMMENTS",
        WO.WorkOrderPlannerNotes AS "PLANNER_COMMENTS",
        WO.WorkOrderStatus AS "STATUS",
        WO.EquipmentOperationsGroup AS "OPSGROUP",
        WO.WorkOrderSurfaceAssetBK AS "DEPARTMENT",
        WO.WorkOrderEquipmentCodeBK AS "EQUIPMENT",
        WO.WorkOrderAssignedToResourceBK AS "ASSIGNED_TO",
        CAST( 
            CAST(WO.WorkOrderPMDueDate AS DATE FORMAT 'MM/DD/YYYY') AS DATE FORMAT 'MM/DD/YYYY')
                                                         AS "PM_ORIGINAL_DUE_DATE",
        SE.EquipmentIC AS "EQUIPMENT_IC",
        WO.WorkOrderDeferralExpirationDate AS "DEFERRAL_EXPERATION_DATE",
        WO.WorkOrderObjCriticality AS "CRITICALITY",
        PM.PMWorkOrderJobType AS "PM_TYPE",
        NULL AS "DEFERRAL_REQUIRED_IF_LATE",
        SE.EquipmentCostCode AS "COST_CODE",
        SE.EquipmentClassBK AS "EQ_CLASS",
        WS.ActivityCode AS "Activity",
        WS.ActivityTradeCodeBK AS "Trade",
        SUM(WS.ActivityEstimatedHours) "HOURS"

FROM     IDW_PL_SURFACEMAINTENANCE.DIMWorkOrder WO 
    JOIN IDW_PL_SURFACEMAINTENANCE.DIMSurfacePM PM ON PM.PMCodeBK = WO.WorkOrderPMCodeBK
    JOIN IDW_PL_SURFACEMAINTENANCE.DIMSurfaceEquipment SE ON SE.EquipmentCodeBK = WO.WorkOrderEquipmentCodeBK
    LEFT JOIN IDW_PL_SURFACEMAINTENANCE.FACTWorkOrderActivity WS ON WS.ActivityWorkOrderCodeBK = WO.WorkOrderCodeBK
WHERE 1=1
AND  DEPARTMENT IN ('CO','CY','KR','LH','MS','SA')
AND  STATUS IN ('R','SCH')
AND  PM IS NOT NULL
AND  PM_ORIGINAL_DUE_DATE >= CURRENT_DATE
AND  PM_ORIGINAL_DUE_DATE <= CURRENT_DATE + 115
AND  WORKORDER IS NOT NULL
GROUP BY WORKORDER, PM , DESCRIPTION, COMMENTS, PLANNER_COMMENTS, STATUS, OPSGROUP, DEPARTMENT, EQUIPMENT, ASSIGNED_TO, PM_ORIGINAL_DUE_DATE, EQUIPMENT_IC, DEFERRAL_EXPERATION_DATE, CRITICALITY, PM_TYPE, DEFERRAL_REQUIRED_IF_LATE, COST_CODE, EQ_CLASS, Activity, Trade, HOURS
ORDER BY DEPARTMENT

现在您正在 GROUP BY 中使用列别名。在聚合查询的大多数数据库引擎操作顺序中,GROUP BY 通常在 SELECT 之前,因此在该步骤中不会知道列别名。话虽如此,ORDERSELECT 之后跟随 ,因此可以使用 "DEPARTMENT" 别名。

众所周知的讽刺 SQL 是作为第一个子句出现的 SELECT 通常是最后的步骤之一 运行。 SQL 本质上是声明性的,它不像 运行 按编写顺序排列的过程语言。因此,只需使用 GROUP BY 中的原始非标量列,而不是列别名。

SELECT
        WO.WorkOrderCodeBK AS "WORKORDER",
        WO.WorkOrderPMCodeBK AS "PM",
        WO.WorkOrderDescription AS "DESCRIPTION",
        NULL AS "COMMENTS",
        WO.WorkOrderPlannerNotes AS "PLANNER_COMMENTS",
        WO.WorkOrderStatus AS "STATUS",
        WO.EquipmentOperationsGroup AS "OPSGROUP",
        WO.WorkOrderSurfaceAssetBK AS "DEPARTMENT",
        WO.WorkOrderEquipmentCodeBK AS "EQUIPMENT",
        WO.WorkOrderAssignedToResourceBK AS "ASSIGNED_TO",
        CAST(CAST(WO.WorkOrderPMDueDate AS DATE FORMAT 'MM/DD/YYYY')  
             AS DATE FORMAT 'MM/DD/YYYY') AS "PM_ORIGINAL_DUE_DATE",
        SE.EquipmentIC AS "EQUIPMENT_IC",
        WO.WorkOrderDeferralExpirationDate AS "DEFERRAL_EXPERATION_DATE",
        WO.WorkOrderObjCriticality AS "CRITICALITY",
        PM.PMWorkOrderJobType AS "PM_TYPE",
        NULL AS "DEFERRAL_REQUIRED_IF_LATE",
        SE.EquipmentCostCode AS "COST_CODE",
        SE.EquipmentClassBK AS "EQ_CLASS",
        WS.ActivityCode AS "Activity",
        WS.ActivityTradeCodeBK AS "Trade",
        SUM(WS.ActivityEstimatedHours) AS "HOURS"

FROM     IDW_PL_SURFACEMAINTENANCE.DIMWorkOrder WO 
    INNER JOIN IDW_PL_SURFACEMAINTENANCE.DIMSurfacePM PM ON PM.PMCodeBK = WO.WorkOrderPMCodeBK
    INNER JOIN IDW_PL_SURFACEMAINTENANCE.DIMSurfaceEquipment SE ON SE.EquipmentCodeBK = WO.WorkOrderEquipmentCodeBK
    LEFT JOIN IDW_PL_SURFACEMAINTENANCE.FACTWorkOrderActivity WS ON WS.ActivityWorkOrderCodeBK = WO.WorkOrderCodeBK
WHERE 1=1
  AND  DEPARTMENT IN ('CO','CY','KR','LH','MS','SA')
  AND  STATUS IN ('R','SCH')
  AND  PM IS NOT NULL
  AND  PM_ORIGINAL_DUE_DATE >= CURRENT_DATE
  AND  PM_ORIGINAL_DUE_DATE <= CURRENT_DATE + 115
  AND  WORKORDER IS NOT NULL
GROUP BY 
        WO.WorkOrderCodeBK,
        WO.WorkOrderPMCodeBK,
        WO.WorkOrderDescription,
        WO.WorkOrderPlannerNotes,
        WO.WorkOrderStatus,
        WO.EquipmentOperationsGroup,
        WO.WorkOrderSurfaceAssetBK,
        WO.WorkOrderEquipmentCodeBK,
        WO.WorkOrderAssignedToResourceBK,
        CAST(CAST(WO.WorkOrderPMDueDate AS DATE FORMAT 'MM/DD/YYYY') 
             AS DATE FORMAT 'MM/DD/YYYY'),
        SE.EquipmentIC,
        WO.WorkOrderDeferralExpirationDate,
        WO.WorkOrderObjCriticality,
        PM.PMWorkOrderJobType,
        SE.EquipmentCostCode,
        SE.EquipmentClassBK,
        WS.ActivityCode,
        WS.ActivityTradeCodeBK
ORDER BY "DEPARTMENT"

仔细观察,正如 Teradata 金徽章持有人@dnoeth 所证实的那样,Teradata 可能是在 GROUP BY 中使用非聚合列别名的一个例外。但是,OP 错误地使用了计算的聚合列别名,"HOURS"GROUP BY 子句中,该引用是不允许的,甚至可能是多余的。