【问题标题】:Is it safe to use a (broken?) GROUP BY to calculate percentages? [duplicate]使用(损坏的?) GROUP BY 来计算百分比是否安全? [复制]
【发布时间】:2015-06-30 19:26:35
【问题描述】:

新手问题。我有这张桌子 A:

theDate     |  concept    |  datum
DATE        |  VARCHAR    |  FLOAT
----------------------------------
2000-01-01  |  Concept A  |  19
2000-01-01  |  Concept B  |  10
2000-01-01  |  Concept C  |  0
2001-01-01  |  Concept A  |  30
2001-01-01  |  Concept B  |  15
2001-01-01  |  Concept C  |  0

我需要计算百分比:

theDate     |  concept    |  percentage
DATE        |  VARCHAR    |  FLOAT
----------------------------------
2000-01-01  |  Concept A  |  65.51724138
2000-01-01  |  Concept B  |  34.48275862
2000-01-01  |  Concept C  |  0
2001-01-01  |  Concept A  |  66.66666667
2001-01-01  |  Concept B  |  33.33333333
2001-01-01  |  Concept C  |  0

在没有子查询或自联接的情况下使用单个 GROUP BY 是否安全?像这样:

SELECT theDate, concept, datum * 100 / sum(datum) percentage
FROM A
GROUP BY theDate

注意:我已经查看了这个问题Calculate percentage in SQL,但我觉得它没有回答我的问题。

【问题讨论】:

  • 我猜你正在使用 MySQL?大多数其他 RDBMS 会在此处报告错误,并要求您在 GROUP BY 中也包含 concept, (datum * 100)
  • @MichaelBerkowski 不是我的 RDBMS。它在这个玩具示例中给出了正确的结果,但我害怕将它用于真实数据的生产:-)
  • 只使用一个表,没有连接,concept的不变值,没有完整的GROUP BY也可以。但是如果concept 的值在theDate 组内发生变化,RDBMS 可能会报告该列的不一致和不确定的结果。请使用适当的 RDBMS 标记问题
  • MySQL 有一个变量ONLY_FULL_GROUP_BY,默认为 false,以禁止这种行为。这是我从不允许自己养成的习惯,但在 MySQL 用户中却很常见。当用户从 MySQL 切换到其他工具并发现他们滥用 GROUP BY 时,我们经常在 Stack Overflow 上看到混乱。
  • 我赞成你的问题 - 我不会回答,而是将其链接到 against this one,它已经有 2 个比我的 cmets 更彻底的好答案。

标签: sql group-by percentage


【解决方案1】:

正确的方法是这样的..但是在mysql中它不会给出任何错误...

SELECT theDate, concept, datum * 100 / sum(datum) percentage
FROM A
GROUP BY (theDate,concept)

【讨论】:

  • 如果我们按日期和概念分组,百分比将毫无意义。
  • @Tim3880 对于给定的样本行,是的,但如果 concept 根据 theDate 是非唯一的,则不是。
  • @ravi-teja-kaveti Tnx.
猜你喜欢
  • 2013-05-31
  • 2016-07-02
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多