Mysql сумма и показать все реестры - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь суммировать и показать все реестры в MySQL.у меня есть этот запрос:

select `deliverables`.*, 
       `users`.`first_name`, 
       `users`.`last_name` 
from `deliverables` 
inner join `users` on `users`.`id` = `deliverables`.`user_id` 
where `deliverables`.`specialty_id` = '11' and 
      `deliverables`.`role_id` <> '1' 

и вывод:

file_code  file_name       dedicated_hours

0001asder  test-file.docx  4
0001as234w asdf.doc        2
jgfjh2546  test.docx       4
0001asder  test-file.docx  1
0001asder  test-file.docx  0
0001asder  test-file.docx  0

мне нужно суммировать выделенные часы, где file_code равен, поэтому он должен выглядеть следующим образом:

file_code  file_name       dedicated_hours  sum

0001asder  test-file.docx  4                5
0001as234w asdf.doc        2                2
jgfjh2546  test.docx       4                4
0001asder  test-file.docx  1                5
0001asder  test-file.docx  0                5
0001asder  test-file.docx  0                5

Я использую сумму (выделенное_часов) и группируем по коду_файла, но он показывает только:

file_code  file_name       dedicated_hours  sum

0001asder  test-file.docx  4                5
0001as234w asdf.doc        2                2
jgfjh2546  test.docx       4                4

Как я могу суммировать и показать все реестры одновременно?

1 Ответ

0 голосов
/ 13 ноября 2018

Ваша версия MySQL (5.0.12) не поддерживает Функции окна (это должно быть достаточным стимулом для обновления, чтобы получить последние вкусности:)

Тем не менее, мы можем использовать Производная таблица для определения агрегированной SUM() для file_code отдельно.Затем мы можем просто присоединиться к основным таблицам, чтобы показать столбец суммы.

SELECT 
  d.file_code,
  d.file_name, 
  d.dedicated_hours,  
  dt.sum, 
  u.first_name, 
  u.last_name 
FROM deliverables AS d 
JOIN users AS u 
  ON u.id = d.user_id 
JOIN
(
  SELECT file_code, 
         SUM(dedicated_hours) AS sum 
   WHERE speciality_id = '11' AND 
         role_id <> '1'
   GROUP BY file_code
) AS dt 
  ON dt.file_code = d.file_code
WHERE d.speciality_id = '11' AND 
      d.role_id <> '1'

MySQL 8.0.2 и выше решение будет просто с использованием SUM(..) OVER (..)

SELECT 
  d.file_code,
  d.file_name, 
  d.dedicated_hours,  
  SUM(d.dedicated_hours) OVER (PARTITION BY d.file_code) AS sum, 
  u.first_name, 
  u.last_name 
FROM deliverables AS d 
JOIN users AS u 
  ON u.id = d.user_id 
WHERE d.speciality_id = '11' AND 
      d.role_id <> '1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...