Сумма детская в двух таблицах стола - PullRequest
0 голосов
/ 22 января 2019

У меня есть 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)

на самом деле у меня есть это:

а

+----------+----------+------------+
|    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   |
+----------+----------+--------+--------+

с:

+----------+----------+----------------------+----------------------+
|    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

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вы делаете m-to-n-join, вместо этого попробуйте UNION ALL:

select ckey, sum(hours) as hours, sum(hours) - sum(hours2) as hours2
from
 (
   SELECT ckey, (b.hht+b.hha) AS hours, NULL as hours2
   FROM b
   UNION ALL
   SELECT ckey, NULL AS hours, 
      FORMAT(IFNULL((TIMESTAMPDIFF(MINUTE, c.date_ini, c.date_fin)/60),0),2)) as hours2
   FROM c
 ) as dt
group by ckey

Если вам действительно нужны столбцы из таблицы, поместите этот Select в производную таблицу и присоединитесь к ней.

0 голосов
/ 22 января 2019

пожалуйста, отметьте это

SELECT 
  (SELECT SUM(hha + hht) from b where b.ckey = a.ckey) hours, 
  FORMAT((SELECT SUM(TIMESTAMPDIFF(MINUTE, c.date_ini, c.date_fin)/60) from c where c.ckey = a.ckey),2) as hours2 
FROM A

Fiddle

0 голосов
/ 22 января 2019

Поскольку у вас есть несколько строк в таблицах 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

Демонстрация по SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...