mysql - 在一个表的两个表中求和孩子
问题描述
我有 3 张桌子:
a (id,date,ckey) b(id,a.ckey,hht,hha) c(id,a.ckey,date_ini,date_fin)
其中 B 将所有要完成的活动及其各自的时间保存在 2 个位置 (hht,hha),而 c 保存已执行的活动及其初始日期和最终日期(以确定执行的时间减去日期)。
现在我需要知道,对于 A 中的每条记录,您分配了多少小时 (B) 以及您完成了多少小时 (C)
实际上我有这个:
A:
+----------+----------+------------+
| id | date | ckey |
+----------+----------+------------+
| 1 |2018-01-20| 18 |
|----------|----------|------------|
乙:
+----------+----------+--------+--------+
| id | a.ckey | hht | hht |
+----------+----------+--------+--------+
| 1 | 18 | 2 | 3 |
| 2 | 18 | 2 | 5 |
| 3 | 18 | 0 | 7 |
+----------+----------+--------+--------+
C:
+----------+----------+----------------------+----------------------+
| id | a.ckey | date_ini | date_fin |
+----------+----------+----------------------+----------------------+
| 1 | 18 | 2019-01-23 13:30:00 | 2019-01-23 14:00:00 |
| 1 | 18 | 2019-01-23 14:00:00 | 2019-01-23 14:30:00 |
+----------+----------+----------------------+----------------------+
我需要这个:
+----------+----------+----------------------+----------------------+
| id | a.ckey | hours | hours2 |
+----------+----------+----------------------+----------------------+
| 1 | 18 | 19 | 1 |
+----------+----------+----------------------+----------------------+
我明白了:
+----------+----------+----------------------+----------------------+
| id | a.ckey | hours | hours2 |
+----------+----------+----------------------+----------------------+
| 1 | 18 | 38 | 37.5 |
+----------+----------+----------------------+----------------------+
这是我的查询:
SELECT
(b.hht+b.hha) AS hours,
(SUM(b.hht+b.hha) -
FORMAT(IFNULL((TIMESTAMPDIFF(MINUTE, c.date_ini, c.date_fin)/60),0),2)) AS hours2
FROM a
LEFT JOIN b ON a.key=b.akey
INNER JOIN c ON a.key=c.akey
GROUP a.ckey
解决方案
因为您在表中有多行,b
并且c
对于每个值,ckey
您需要在子查询中进行聚合,否则您会得到重复的行,从而导致不正确的总和。
SELECT a.id, a.key, b.hours, FORMAT(c.minutes/60, 2) AS hours2
FROM a
LEFT JOIN (SELECT akey, SUM(hht+hha) AS hours
FROM b
GROUP BY akey) b ON b.akey = a.key
LEFT JOIN (SELECT akey, SUM(TIMESTAMPDIFF(MINUTE, date_ini, date_fin)) AS minutes
FROM c
GROUP BY akey) c ON c.akey = a.key
ORDER BY a.id
输出:
id key hours hours2
1 18 19 1.00
推荐阅读
- javascript - 使用 HTML CSS JS 为每个外部列表项创建链接
- excel - 将单元格中输入的值添加到同一列中的另一个单元格
- r - 将偏移变量合并到栅格中以预测泊松回归的最佳方法
- javascript - 将值映射到数组对象中的键
- java - 如果 amazonSqsAsync 无效,则阻止加载 SqsListener 和 AwsConfiguration
- c++ - 如何为全局类型设置静态计数器?
- c# - 如何查找(分组的)键的一部分是否在列表中多次出现?
- java - 在 Telosys 中使用 Dsl 模型生成带有链接的实体的问题
- url - 自动查找默认的索引文件在边缘浏览器中不起作用
- c# - 从 Razor 页面中 Index.chtml.cs 中的操作方法加载的 Ajax Partial 中的依赖注入