【发布时间】: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