在 GROUP BY 查询中除以值

Posted

技术标签:

【中文标题】在 GROUP BY 查询中除以值【英文标题】:Dividing values in a GROUP BY query 【发布时间】:2021-12-08 18:19:18 【问题描述】:

我试图将 numHospitalizations 除以 numCases 以获得住院百分比,将 numDeaths 除以 numCases 以获得死亡百分比。有很多重复的卫生区,所以我认为最好按 healthDistrict 分组,但我不断得到:

不是 GROUP BY 表达式。

SELECT healthDistrict AS HEALTH_DISTRICT
    , (numHospitalizations / numCases) AS PERCENTHOSP
    , (numDeaths / numCases) AS PERCENTDEATH
FROM CovidReport
GROUP BY UPPER(healthDistrict);

【问题讨论】:

您确定您使用的是 SQL Server 吗?您是否在 SSMS 中使用某些查询设计器或其他一些 UI 工具来设计查询? “不是按表达式分组”不是 SQL Server 错误消息,也许您可​​以发布整个消息?此外,如果您的列是 int 或类似的,SQL Server 使用整数数学,例如10/7 = 17/10 = 0。因此,您还需要在每个表达式的某处执行十进制转换。 另外,请显示一些示例数据和所需的结果,以便我们知道您想要什么。从查询中,我无法从'my district', 200, 126, 12'my district', 170, 112, 14 中看出您想要什么答案。你想要平均值超过总和,超过最大值,还是别的? 【参考方案1】:

您需要对未分组的所有列进行聚合(并防止被零除)。

SELECT
  UPPER(healthDistrict) AS HEALTH_DISTRICT,
  CASE WHEN SUM(numCases) > 0 THEN SUM(numHospitalizations) * 1.0 / SUM(numCases) ELSE 0 END AS PERCENTHOSP,
  CASE WHEN SUM(numCases) > 0 THEN SUM(numDeaths) * 1.0 / SUM(numCases) ELSE 0 END AS PERCENTDEATH
FROM
  SomethingSlightlyLessMorbid
GROUP BY
  UPPER(healthDistrict);

【讨论】:

【参考方案2】:

我猜这就是你想要的,但an MCVE would be really useful。

;WITH agg AS
(
  SELECT 
    UPPER(healthDistrict) AS HEALTH_DISTRICT, 
    Hosp   = SUM(numHospitalizations)*1.0,
    Cases  = NULLIF(SUM(numCases)*1.0,0),
    Deaths = SUM(numDeaths)*1.0
  FROM dbo.SomethingSlightlyLessMorbid
  GROUP BY UPPER(healthDistrict)
)
SELECT HEALTH_DISTRICT,
       PERCENTHOSP  = CONVERT(decimal(8,2), (Hosp   / Cases)), 
       PERCENTDEATH = CONVERT(decimal(8,2), (Deaths / Cases))
FROM agg;
示例db<>fiddle

【讨论】:

...我想知道,为什么是 CTE? (这也会导致除以零) @Tomalak why the CTE? 所以我不必重复SUM(numCases) 四次。 division by zero 可能,尽管我希望一行进入这个特定数据集的案例是 0 的可能性不大。已修复,也没有多个冗长的 CASE 表达式。 :-) 如果 0 是可能的,我会让 OP 决定他们想要 0 还是 NULL。 我知道 SQL Server 实际上不应该重新计算 SUM,但我也不知道它是否保证不会。无论如何,很多人认为会,然后我们必须进行这种确切的对话,这似乎是多余的,所以我尽量避免它。仅提及一次also 的 CTE 并不能保证它不会被计算多次。但它对我来说确实看起来更干净。 YMMV。 @Tomalak 我认为“不太复杂的语法”也是主观的。我发现重复不必要地复杂,在 Stack Overflow 上这么多年后,将事物从逻辑上分离成 CTE 通常有助于人们更好地掌握概念。

以上是关于在 GROUP BY 查询中除以值的主要内容,如果未能解决你的问题,请参考以下文章

如何包含包含 GROUP BY 的查询遗漏的缺失值?

mysql 可以group by 两个字段吗

mysql group by 能用到索引么

如何使用group by 分组查询表中所有字段信息

Django 查询模型 - GROUP BY、MIN、MAX

有没有办法将列的值聚合和/或连接为 Group By 查询中的逗号分隔项?