我正在尝试修改查询以生成对未来工作的预测,以总结分配给某些交易的工作量,但是,当我在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
答案 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
,该子索引是不允许的,甚至可能是多余的。