首页 > 解决方案 > 当列在 SELECT 的 CASE 中使用时,我们可以避免/纠正按列分组吗

问题描述

我有一张桌子,它有几列,我需要使用其中的几列,并且需要按“卡车”分组。所有其他列显示将使用聚合函数的数字。

我将 CASE 语句用于“负载”,其值范围为 0 到 7。

当我在 SELECT 的 CASE 中使用“load”时,我必须在 GROUP BY 中强制使用“load”列,这会破坏我的结果。这是查询:

SELECT 
truck
, CASE WHEN load IN (1,2,6) THEN COUNT(truck) ELSE 0 END AS Bauxite_Loads
, CASE WHEN load IN (3,4,5) THEN COUNT(truck) ELSE 0 END Waste_Loads
, CASE WHEN load = 7 THEN COUNT(truck) ELSE 0 END Rehandle_Loads
, COUNT(truck) as Total_Loads
, CASE WHEN load IN (1,2,6) THEN SUM(loadtons) ELSE 0 END Bauxite_Tons
, CASE WHEN load IN (3,4,5) THEN SUM(loadtons) ELSE 0 END Waste_Tons
, CASE WHEN load = 7 THEN SUM(loadtons) ELSE 0 END Rehandle_Tons
, SUM(loadtons) as Total_Tons
, SUM(disteh) as Empty_Distance
,SUM(distfh) as Full_Distance
FROM [DatabaseName].[dbo].[hist_loads_new]
WHERE shiftindex = 38683
GROUP BY truck,load

这就是我通过上述查询得到的结果: 在此处输入图像描述

当我加入另一个表时,它也会产生更多问题,例如它加入 HD62 3 次而不是 1 次。因此,作为一种解决方法,我必须将加入表中的值除以 COUNT(truck)。

这应该是预期的结果: 在此处输入图像描述

要获得预期的结果,我必须使用以下查询:

SELECT truck, SUM(Bauxite_Loads) AS 'Bauxite Tons', SUM(Waste_Loads) AS 'Waste Tons', SUM(Rehandle_Loads) AS 'Rehandle Tons', SUM(Total_Loads) AS 'Total_Loads'
       ,SUM(Bauxite_Tons) AS 'Bauxite Tonnes', SUM(Waste_Tons) AS 'Waste Tonnes', SUM(Rehandle_Tons) AS 'Rehandle Tons', SUM(Total_Tons) AS 'Total Tons'
       ,SUM(Empty_Distance) AS 'Empty Distance', SUM(Full_Distance) AS 'Full Distance'
FROM
(
SELECT 
truck
, CASE WHEN load IN (1,2,6) THEN COUNT(truck) ELSE 0 END AS Bauxite_Loads
, CASE WHEN load IN (3,4,5) THEN COUNT(truck) ELSE 0 END Waste_Loads
, CASE WHEN load = 7 THEN COUNT(truck) ELSE 0 END Rehandle_Loads
, COUNT(truck) as Total_Loads
, CASE WHEN load IN (1,2,6) THEN SUM(loadtons) ELSE 0 END Bauxite_Tons
, CASE WHEN load IN (3,4,5) THEN SUM(loadtons) ELSE 0 END Waste_Tons
, CASE WHEN load = 7 THEN SUM(loadtons) ELSE 0 END Rehandle_Tons
, SUM(loadtons) as Total_Tons
, SUM(disteh) as Empty_Distance
,SUM(distfh) as Full_Distance
FROM [DatabaseName].[dbo].[hist_loads_new]
WHERE shiftindex = 38683
GROUP BY truck,load
) T1
GROUP BY truck

我知道由于 SQL 语句的执行顺序,不能在 GROUP BY 中使用列别名。我也尝试在 GROUP BY 中使用 CASE 语句,但不起作用。我在 PostgreSQL 中阅读了这两项工作。

我需要按“负载”分组,而不是按每个数字分组,分组应根据 CASE 语句 (1,2,6) , (3,4,5) 和 7 中的 3 组。

那么,这是使用内联视图/子查询的唯一方法吗?或者有没有一种方法可以通过调整 GROUP BY 子句在单个查询中实现?

标签: sql-server

解决方案


聚合器函数需要对整个表达式进行操作才能按您的意愿运行。这也应该解决您的负载列问题。

然后您还可以删除外部选择并从 group by 中删除负载(我假设它是错误的)。

所有行都喜欢

CASE WHEN load IN (1,2,6) THEN COUNT(truck) ELSE 0 END AS Bauxite_Loads

应该

SUM(CASE WHEN load IN (1,2,6) THEN 1 ELSE 0 END) AS Bauxite_Loads

CASE WHEN load IN (1,2,6) THEN SUM(loadtons) ELSE 0 END Bauxite_Tons

应该更像

SUM(CASE WHEN load IN (1,2,6) THEN loadtons ELSE 0 END) Bauxite_Tons

最终选择(您可能想要调整的列别名):

 SELECT 
 truck
 , SUM(CASE WHEN load IN (1,2,6) THEN 1 ELSE 0 END) AS Bauxite_Loads
 , SUM(CASE WHEN load IN (3,4,5) THEN 1 ELSE 0 END) Waste_Loads
 , SUM(CASE WHEN load = 7 THEN 1 ELSE 0 END) Rehandle_Loads
 , COUNT(*) as Total_Loads
 , SUM(CASE WHEN load IN (1,2,6) THEN loadtons ELSE 0 END) Bauxite_Tons
 , SUM(CASE WHEN load IN (3,4,5) THEN loadtons ELSE 0 END) Waste_Tons
 , SUM(CASE WHEN load = 7 THEN loadtons ELSE 0 END) Rehandle_Tons
 , SUM(loadtons) as Total_Tons
 , SUM(disteh) as Empty_Distance
 ,SUM(distfh) as Full_Distance
 FROM [DatabaseName].[dbo].[hist_loads_new]
 WHERE shiftindex = 38683
 GROUP BY truck

推荐阅读