несколько сумм на сгруппированных таблицах - PullRequest
0 голосов
/ 06 января 2020
Table Header
+---------+-------+
| ref     | total | 
+---------+-------+
| 2544    |  2000 |
| 2544    |    10 |
| 2545    |  2566 |
| 2545    |    34 |
+---------+-------+

Table Items
+---------+-------+
| ref     | total | 
+---------+-------+
| 2544    |  1500 |
| 2544    |   500 |
| 2545    |  2000 |
| 2545    |   500 |
| 2545    |   100 |
+---------+-------+

Я хотел бы суммировать итоговый столбец в обеих таблицах, сгруппированных по ref, чтобы мой вывод выглядел примерно так:

Output:
+---------+--------------+-------------+
| ref     | total_header | total_items | 
+---------+--------------+-------------+
| 2544    |        2010  |       2000  |
| 2545    |        2600  |       2600  |
+---------+--------------+-------------+

Затем я могу сравнить два итоговых столбца и проверить различия .

Запрос:

Select
    Header.ref,
    Sum(Header.total) as total_header
From
    Header
Group By
    Header.ref
Order By
    Header.ref Desc

Это дает мне правильную информацию для таблицы заголовков. Как только я добавляю таблицу Items в запрос, то total_header и total_items дают неправильные значения

Вот запрос, который я использую ....

Select
    Header.ref,
    Sum(Header.total) as total_header,
    Sum(Items.total) as total_items
From
    Header Left Join
    Items On Header.ref = Items.ref
Group By
    Header.ref
Order By
    Header.ref Desc

Может кто-нибудь помочь мне создать запрос, который будет производить вывод выше? Также, если это возможно, с другим столбцом, который сравнивает 2 полных столбца, дающих истину или ложь, в зависимости от того, совпадают ли они.

Ответы [ 4 ]

1 голос
/ 06 января 2020

Вы можете сначала получить сумму, а затем присоединиться к ней -

SELECT H.ref, H_TOT, I_TOT
FROM (SELECT ref, SUM(total) H_TOT
      FROM Header
      GROUP BY ref) H
JOIN (SELECT ref, SUM(total) I_TOT
      FROM Items
      GROUP BY ref) I ON H.ref = I.ref
ORDER BY H.ref
0 голосов
/ 06 января 2020

Возможное решение

SELECT refs.ref, sum_header.header_total, sum_items.items_total
FROM ( SELECT ref FROM header
       UNION
       SELECT ref FROM items ) refs
LEFT JOIN ( SELECT ref, SUM(total) header_total
            FROM header
            GROUP BY ref ) sum_header USING (ref)
LEFT JOIN ( SELECT ref, SUM(total) items_total
            FROM items
            GROUP BY ref ) sum_items USING (ref)

Наилучшая ситуация для этого решения:

  1. SELECT COUNT(*)/COUNT(DISTINCT ref) высокое, ~ (10 или более) для обеих таблиц.
  2. ref проиндексирован в обеих таблицах (дополнительно попробуйте SELECT DISTINCT ref FROM в первом подзапросе для обеих таблиц).
0 голосов
/ 06 января 2020

С UNION ALL из 2 таблиц и затем агрегировать:

select t.ref,
  sum(t.total_header) total_header,
  sum(t.total_items) total_items,
  sum(t.total_header) = sum(t.total_items) matching
from (  
  select ref, total total_header, 0 total_items from Header
  union all
  select ref, 0 total_header, total total_items from Items
) t  
group by t.ref

См. Демоверсию . Результаты:

| ref  | total_header | total_items | matching |
| ---- | ------------ | ----------- | -------- |
| 2544 | 2010         | 2000        | 0        |
| 2545 | 2600         | 2600        | 1        |
0 голосов
/ 06 января 2020

Вы можете просто использовать

Select ref, sum(header.total) as total_header, sum(items.total) as total_items
from header,items where header.ref = items.ref
group by ref
order by ref desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...