Объедините несколько счетов с группой, включая нули - PullRequest
0 голосов
/ 30 марта 2019

У меня есть 3 таблицы: Оборудование, Разделы и Пользователи, и я хочу объединить 3 таблицы, сгруппированные по разделам, и показать общее количество оборудования на раздел и общее количество пользователей на раздел, включая нули

Example equipment table:


ID  Device Name    SectionID    Device Type
1   Holly's computer    1       PC
2   John's mobile       2       mobile
3   Maggie's printer    3       printer
4   Jonathan's scanner  3       scanner
5   George's scanner    2       scanner
6   Dugans handheld     5       scanner
7   Main printer        5       printer

Example sections table:
ID  Section
1   Finance
2   HR
3   IT
4   Manager
5   Storage

Example users table
ID  User         SectionID
1   John            3
2   George          2
3   Amanda          2
4   Andy            4
5   Katherine       1

Я пробовал это:

SELECT 
b.section AS GROUPED_SECTION, 
COUNT(distinct a.sectionid) AS TOTAL_EQUIPMENT, 
COUNT(distinct c.sectionid) AS TOTAL_USERS 
FROM Equipment a 
LEFT JOIN Section b ON a.sectionid=b.id 
LEFT JOIN Users c on a.sectionid=c.sectionid 
GROUP BY b.description 
ORDER BY b.description

но что-то работает неправильно

Я хочу создать запрос, который будет иметь следующий результат:

SECTION        TOTAL_EQUIPMENT         TOTAL_USERS
-------        ---------------         ------------ 
Finance               1                     1 
IT                    2                     1
HR                    2                     2
Manager               0                     1
Storage               2                     0

-1-й столбец представляет отдельные разделы из ОборудованияТаблица

-2-й столбец представляет общее количество оборудования на секцию согласно Таблице оборудования

-3-й столбец представляет общее количество пользователей в этом разделе согласно таблице Пользователи

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Использование UNION ALL для SectionID в таблицах equipment и users. и создайте столбец grp, чтобы разделить две разные таблицы.

затем выполните OUTER JOIN на основе таблицы sections, агрегатная функция окончательного использования get count.

Запрос 1 :

SELECT s.Section,
       COUNT(CASE WHEN grp = 1 THEN 1 END) TOTAL_EQUIPMENT,
       COUNT(CASE WHEN grp = 2 THEN 1 END) TOTAL_USERS
FROM sections s 
LEFT JOIN (
  select SectionID,1 grp
  from equipment
  UNION ALL
  select SectionID,2 grp
  from users
) t1 on t1.SectionID = s.ID
GROUP BY s.Section

Результаты

| Section | TOTAL_EQUIPMENT | TOTAL_USERS |
|---------|-----------------|-------------|
| Finance |               1 |           1 |
|      HR |               2 |           2 |
|      IT |               2 |           1 |
| Manager |               0 |           1 |
| Storage |               2 |           0 |
0 голосов
/ 30 марта 2019

Запрос к CTE прост, подсчитайте каждую из двух дочерних таблиц, затем присоедините их к родительской таблице (разделу)

Тест в реальном времени: http://sqlfiddle.com/#!18/f9f99/4

with eq as
(
  select sectionid, count(*) as total_equipment
  from equipment 
  group by sectionid
  )
, uq  as
(
  select sectionid, count(*) as total_users
  from users
  group by sectionid
  )
 select s.id, s.section, 
   total_equipment = isnull(eq.total_equipment, 0), 
   total_users = isnull(uq.total_users, 0)
 from sections s
 left join eq on s.id = eq.sectionid 
 left join uq on s.id = uq.sectionid
 order by s.section

Выход:

| id | section | total_equipment | total_users |
|----|---------|-----------------|-------------|
|  1 | Finance |               1 |           1 |
|  2 |      HR |               2 |           2 |
|  3 |      IT |               2 |           1 |
|  4 | Manager |               0 |           1 |
|  5 | Storage |               2 |           0 |
...