mysql - MySQL Query 试图(CROSS?)在一张表上加入
问题描述
一直试图解决这个问题几个小时,并希望得到一些专家的帮助:
我有一个 Mysql 表,其中包含以下数据:
Date version amount
2021-03-01 A 100
2021-03-02 A 35
2021-03-02 B 80
2021-03-03 A 7
2021-03-03 B 90
2021-03-03 C 3
2021-03-03 A 8
2021-03-04 B 15
2021-03-04 C 90
2021-03-04 B 10
并尝试每天为每个版本获取输出,将数量填充为 null 的“0”;结果:
Date version SUM(amount)
2021-03-01 A 100
2021-03-01 B 0
2021-03-01 c 0
2021-03-02 A 35
2021-03-02 B 80
2021-03-02 C 0
2021-03-03 A 15
2021-03-03 B 90
2021-03-03 C 3
2021-03-04 A 0
2021-03-04 B 25
2021-03-04 C 90
我尝试了各种“JOIN”、“LEFT JOIN”和“CROSS JOIN”排列,但均未成功。
SELECT distinct c1.date, c2.version
FROM crash_log c1
LEFT OUTER JOIN crash_log c2 ON c1.date = c2.date
GROUP BY c1.date, c2.version
(甚至没有弄乱 SUM,只是想用这个来获取所有行)
现在,我有一个通过蛮力执行此操作的脚本:获取 DISTINCT 日期,然后获取 DISTINCT 版本,然后执行嵌套循环并为每个组合构建一个数组。一个问题是它不可扩展,并且似乎 Web 连接在流程完成之前就超时了。
我在想有一个(半?)有效的查询可以做到这一点,但我无法弄清楚。
解决方案
编写子查询以获取所有日期和版本。交叉加入这些以获得每个组合。
然后将其与表连接起来以获得实际值或在 NULL 时默认为 0。
SELECT d.date, v.version, IFNULL(c.sum, 0) AS sum
FROM (
SELECT DISTINCT date
FROM crash_log) AS d
CROSS JOIN (
SELECT DISTINCT version
FROM crash_log) AS v
LEFT JOIN (
SELECT date, version, SUM(amount) AS sum
FROM crash_log
GROUP BY date, version) AS c ON d.date = c.date AND v.version = c.version
ORDER BY d.date, v.version
推荐阅读
- javascript - 丢弃 Javascript 文件并在 Django 2.2 的 HTML 模板页面中使用另一个文件
- r - 测试组均值在 R 中是否在统计上显着不同
- variables - Running Things in Parallel with SAS Enterprise Guide
- java - Get the checked radio button
- python - 需要一个递归函数来获取数组的所有排列,其中每个元素都是本身加上 0 到 n
- html - Same height for boxes in both columns
- internationalization - 场景生成器的国际化包?
- discord.js - SyntaxError:意外的令牌':'
- r - R - 使用 reshape2 或 dplyr 在同一单元格中使用多个元素重塑数据框
- sql-server - SQL Query returns no results when using declared variables, but does when plugging in those values