MySQL: SUM(CASE WHEN(...)) + GROUP BY。为什么使用 GROUP BY 也无法显示数据集的详细信息?
MySQL: SUM(CASE WHEN(...)) + GROUP BY. Why details of dataset cannot show even with GROUP BY?
来源:Leetcode 1308。运行 不同性别的总数
样本分数table:
+-------------+--------+------------+--------------+
| player_name | gender | day | score_points |
+-------------+--------+------------+--------------+
| Aron | F | 2020-01-01 | 17 |
| Alice | F | 2020-01-07 | 23 |
| Bajrang | M | 2020-01-07 | 7 |
| Khali | M | 2019-12-25 | 11 |
| Slaman | M | 2019-12-30 | 13 |
| Joe | M | 2019-12-31 | 3 |
| Jose | M | 2019-12-18 | 2 |
| Priya | F | 2019-12-31 | 23 |
| Priyanka | F | 2019-12-30 | 17 |
+-------------+--------+------------+--------------+
要求:编写一个 SQL 查询以查找每个性别每天的(累计)总分。
按性别和日期对结果 table 进行排序。示例结果table如下:
+--------+------------+-------+
| gender | day | total |
+--------+------------+-------+
| F | 2019-12-30 | 17 |
| F | 2019-12-31 | 40 |
| F | 2020-01-01 | 57 |
| F | 2020-01-07 | 80 |
| M | 2019-12-18 | 2 |
| M | 2019-12-25 | 13 |
| M | 2019-12-30 | 26 |
| M | 2019-12-31 | 29 |
| M | 2020-01-07 | 36 |
+--------+------------+-------+
我的代码如下。我不明白为什么它只有 returns 一行 [{"headers": ["gender", "day", "total"], "values": [["F", "2019-12-30 ", 184]]}], 即使使用 GROUP BY.
SELECT s1.gender, s1.day,
SUM(CASE WHEN s1.day < s2.day AND s1.gender = s2.gender THEN s1.score_points ELSE 0 END) AS total
FROM Scores s1, Scores s2
GROUP BY s1.gender AND s1.day
ORDER BY s1.gender AND s1.day
如果有人能帮助我,非常感谢!!
AND
是 returns true/false (1/0) 的布尔运算。您似乎想要条件聚合:
SELECT s.day,
SUM(CASE WHEN s.gender = 'M' THEN s.score_points ELSE 0 END) AS total_male,
SUM(CASE WHEN s.gender = 'F' THEN s.score_points ELSE 0 END) AS total_female
FROM Scores s
GROUP BY s.day
ORDER BY s.day;
GROUP BY
键决定结果集的外观。每组唯一值在结果集中有一行,其余列汇总以适合该行。
在这种情况下,您需要每天一行,所以这就是 GROUP BY
.
中应该包含的内容
然后对于累计金额使用window函数:
SELECT s.day,
SUM(CASE WHEN s.gender = 'M' THEN s.score_points ELSE 0 END) AS total_male,
SUM(CASE WHEN s.gender = 'F' THEN s.score_points ELSE 0 END) AS total_female,
SUM(SUM(CASE WHEN s.gender = 'M' THEN s.score_points ELSE 0 END)) OVER (ORDER BY s.day) AS running_male,
SUM(CASE WHEN s.gender = 'F' THEN s.score_points ELSE 0 END) OVER (ORDER BY s.day) AS running_female
FROM Scores s
GROUP BY s.day
ORDER BY s.day;
您应该使用 ON
子句进行适当的连接,并对 GROUP BY
和 ORDER BY
使用有效语法:
select s1.gender, s1.day, sum(s2.score_points) total
from scores s1 inner join scores s2
on s2.gender = s1.gender and s2.day <= s1.day
group by s1.gender, s1.day
order by s1.gender, s1.day
参见demo。
结果:
| gender | day | total |
| ------ | -----------| ----- |
| F | 2019-12-30 | 17 |
| F | 2019-12-31 | 40 |
| F | 2020-01-01 | 57 |
| F | 2020-01-07 | 80 |
| M | 2019-12-18 | 2 |
| M | 2019-12-25 | 13 |
| M | 2019-12-30 | 26 |
| M | 2019-12-31 | 29 |
| M | 2020-01-07 | 36 |
我不确定这是否有效,但它会通过:
SELECT T1.gender, T1.day, SUM(T2.score_points) AS total
FROM Scores T1
JOIN Scores T2
WHERE T1.gender = T2.gender AND T2.day <= T1.day
GROUP BY T1.gender, t1.day
ORDER BY t1.gender, t1.day;
参考资料
来源:Leetcode 1308。运行 不同性别的总数
样本分数table:
+-------------+--------+------------+--------------+
| player_name | gender | day | score_points |
+-------------+--------+------------+--------------+
| Aron | F | 2020-01-01 | 17 |
| Alice | F | 2020-01-07 | 23 |
| Bajrang | M | 2020-01-07 | 7 |
| Khali | M | 2019-12-25 | 11 |
| Slaman | M | 2019-12-30 | 13 |
| Joe | M | 2019-12-31 | 3 |
| Jose | M | 2019-12-18 | 2 |
| Priya | F | 2019-12-31 | 23 |
| Priyanka | F | 2019-12-30 | 17 |
+-------------+--------+------------+--------------+
要求:编写一个 SQL 查询以查找每个性别每天的(累计)总分。 按性别和日期对结果 table 进行排序。示例结果table如下:
+--------+------------+-------+
| gender | day | total |
+--------+------------+-------+
| F | 2019-12-30 | 17 |
| F | 2019-12-31 | 40 |
| F | 2020-01-01 | 57 |
| F | 2020-01-07 | 80 |
| M | 2019-12-18 | 2 |
| M | 2019-12-25 | 13 |
| M | 2019-12-30 | 26 |
| M | 2019-12-31 | 29 |
| M | 2020-01-07 | 36 |
+--------+------------+-------+
我的代码如下。我不明白为什么它只有 returns 一行 [{"headers": ["gender", "day", "total"], "values": [["F", "2019-12-30 ", 184]]}], 即使使用 GROUP BY.
SELECT s1.gender, s1.day,
SUM(CASE WHEN s1.day < s2.day AND s1.gender = s2.gender THEN s1.score_points ELSE 0 END) AS total
FROM Scores s1, Scores s2
GROUP BY s1.gender AND s1.day
ORDER BY s1.gender AND s1.day
如果有人能帮助我,非常感谢!!
AND
是 returns true/false (1/0) 的布尔运算。您似乎想要条件聚合:
SELECT s.day,
SUM(CASE WHEN s.gender = 'M' THEN s.score_points ELSE 0 END) AS total_male,
SUM(CASE WHEN s.gender = 'F' THEN s.score_points ELSE 0 END) AS total_female
FROM Scores s
GROUP BY s.day
ORDER BY s.day;
GROUP BY
键决定结果集的外观。每组唯一值在结果集中有一行,其余列汇总以适合该行。
在这种情况下,您需要每天一行,所以这就是 GROUP BY
.
然后对于累计金额使用window函数:
SELECT s.day,
SUM(CASE WHEN s.gender = 'M' THEN s.score_points ELSE 0 END) AS total_male,
SUM(CASE WHEN s.gender = 'F' THEN s.score_points ELSE 0 END) AS total_female,
SUM(SUM(CASE WHEN s.gender = 'M' THEN s.score_points ELSE 0 END)) OVER (ORDER BY s.day) AS running_male,
SUM(CASE WHEN s.gender = 'F' THEN s.score_points ELSE 0 END) OVER (ORDER BY s.day) AS running_female
FROM Scores s
GROUP BY s.day
ORDER BY s.day;
您应该使用 ON
子句进行适当的连接,并对 GROUP BY
和 ORDER BY
使用有效语法:
select s1.gender, s1.day, sum(s2.score_points) total
from scores s1 inner join scores s2
on s2.gender = s1.gender and s2.day <= s1.day
group by s1.gender, s1.day
order by s1.gender, s1.day
参见demo。
结果:
| gender | day | total |
| ------ | -----------| ----- |
| F | 2019-12-30 | 17 |
| F | 2019-12-31 | 40 |
| F | 2020-01-01 | 57 |
| F | 2020-01-07 | 80 |
| M | 2019-12-18 | 2 |
| M | 2019-12-25 | 13 |
| M | 2019-12-30 | 26 |
| M | 2019-12-31 | 29 |
| M | 2020-01-07 | 36 |
我不确定这是否有效,但它会通过:
SELECT T1.gender, T1.day, SUM(T2.score_points) AS total
FROM Scores T1
JOIN Scores T2
WHERE T1.gender = T2.gender AND T2.day <= T1.day
GROUP BY T1.gender, t1.day
ORDER BY t1.gender, t1.day;