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

时间:2020-04-09 19:28:15

标签: sql teradata

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

编辑:包括分组和选择,不确定为什么他们没有首先复制...

注意: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

1 个答案:

答案 0 :(得分:2)

现在,您正在GROUP BY中使用列别名。在大多数用于聚集查询的数据库引擎操作顺序中,GROUP BY通常在SELECT之前,因此在该步骤中将不知道列别名。话虽如此,ORDER紧跟在之后 SELECT,因此可以使用"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,该子索引是不允许的,甚至可能是多余的。

相关问题