【发布时间】:2017-02-14 10:03:17
【问题描述】:
我试图让一列在汇总行上有一个特定的值,但是当我添加一个“if”时,所有其他行都会获得该列中的最后一个值。
为什么?而正确的解决方法是什么?
小提琴: http://rextester.com/TTYI19512
例子:
CREATE TABLE ru (ru_id INT KEY, name VARCHAR(20));
INSERT INTO ru VALUES (1, 'A'),(2, 'B');
CREATE TABLE rud (rud_id INT KEY, ru_id INT, value INT);
INSERT INTO rud VALUES (1, 1, 3), (2, 1, 5), (3, 2, 4), (4, 2, 9);
SELECT
ru_id,
IF(ru_id IS NULL, 'Total', name) as name,
COUNT(rud.value),
SUM(rud.value)
FROM ru
INNER JOIN rud USING (ru_id)
GROUP BY ru_id WITH ROLLUP;
当前结果:
+-------+-------+------------------+----------------+
| ru_id | name | COUNT(rud.value) | SUM(rud.value) |
+-------+-------+------------------+----------------+
| 1 | B | 2 | 8 |
| 2 | B | 2 | 13 |
| NULL | Total | 4 | 21 |
+-------+-------+------------------+----------------+
预期结果:
+-------+-------+------------------+----------------+
| ru_id | name | COUNT(rud.value) | SUM(rud.value) |
+-------+-------+------------------+----------------+
| 1 | A | 2 | 8 |
| 2 | B | 2 | 13 |
| NULL | Total | 4 | 21 |
+-------+-------+------------------+----------------+
【问题讨论】:
-
“为什么?” - 因为您正在尝试选择不属于分组的列 –
name。这在“纯”SQL 中是非法的,并且 MySQL 仅在服务器配置为忽略此错误时才允许这样做(在这种情况下,您会从组中的一条记录中获得“随机”值。) -
@CBroe:组中的随机值会很好,但现在我得到组外的值。
-
@CBroe:那是错误的。根据 SQL 标准,您可以选择所有聚合(即
SUM等)、分组依据中的列,以及在功能上取决于它们的列。 (根据给出的表格,name不依赖于ru_id- 或者至少 DBMS 不知道这一点,但即使您将KEY更改为PRIMARY KEY,我们仍然会得到相同的错误结果。 ) -
似乎是 DBMS 中的一个缺陷。查询对我来说看起来不错。请注意,
KEY在 MySQL 中仅表示INDEX。将此PRIMARY KEY设为唯一标识符。 -
@Puggan Se:啊,抱歉,我不知道。 MySQL 似乎在 ROLLUP 方面很糟糕。在 rextester 中,它不显示“总计”。它不知道
ru_id在该行中为空。