Объединить результаты 2 SQL запросов - PullRequest
3 голосов
/ 06 апреля 2020

У меня есть две таблицы с похожими данными, которые я хотел бы сравнить. Следующие запросы предоставляют количество сотрудников в каждой таблице:

SELECT Extract_Month, COUNT(Employee_Number) as Staff
FROM Staff
GROUP BY Extract_Month;

SELECT Extract_Month, COUNT(Employee_Number) as MX
FROM Staff_mx
GROUP BY Extract_Month;

Что приводит к следующему

2019-04-01  17246
2019-05-01  17194
2019-06-01  17252

2019-04-01  17140
2019-05-01  17194
2019-06-01  17434

Я хочу, чтобы запрос объединял результаты в следующем формате:

            Staff MX
2019-04-01  17246 17140
2019-05-01  17194 17194
2019-06-01  17252 17434

Я пробовал это, которое содержало результаты, которые я хотел, но не представляло их правильно:

SELECT s.Extract_Month, COUNT(s.Employee_Number) as Staff, COUNT(mx.Employee_Number) as MX
FROM Staff s
    LEFT JOIN
        staff_mx mx
        ON s.Employee_Number = mx.Employee_Number 
        AND s.Extract_Month = mx.Extract_Month 
GROUP BY s.Extract_Month
UNION ALL
SELECT mx.Extract_Month, COUNT(s.Employee_Number) as Staff, COUNT(mx.Employee_Number) as MX
FROM Staff s
    RIGHT JOIN
        staff_mx mx
        ON s.Employee_Number = mx.Employee_Number 
        AND s.Extract_Month = mx.Extract_Month 
GROUP BY mx.Extract_Month

, который дал мне следующий, но не желаемый результат:

            Staff   MX    
2019-04-01  17246   16830
2019-05-01  17194   16820
2019-06-01  17252   16784
2019-04-01  16830   17140
2019-05-01  16820   17194
2019-06-01  16784   17434

Любая помощь будет оценена!

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

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

SELECT s.Extract_Month, s.staff, sm.mx
FROM (SELECT Extract_Month, COUNT(Employee_Number) as Staff
      FROM Staff
      GROUP BY Extract_Month
     ) s JOIN
     (SELECT Extract_Month, COUNT(Employee_Number) as MX
      FROM Staff_mx
      GROUP BY Extract_Month
     ) sm
     ON sm.Extract_Month = s.Extract_Month;

Если две таблицы не обязательно имеют одинаковые месяцы, используйте FULL JOIN и COALESCE():

SELECT COALESCE(s.Extract_Month, sm.Extract_Month) as Extract_Month,
       COALESCE(s.staff, 0) as staff,
       COALESCE(sm.mx, 0) as mx
FROM (SELECT Extract_Month, COUNT(Employee_Number) as Staff
      FROM Staff
      GROUP BY Extract_Month
     ) s FULL JOIN
     (SELECT Extract_Month, COUNT(Employee_Number) as MX
      FROM Staff_mx
      GROUP BY Extract_Month
     ) sm
     ON sm.Extract_Month = s.Extract_Month;
1 голос
/ 06 апреля 2020

Возможно, вам нужно что-то вроде этого:

SELECT ISNULL(S.Extract_Month,Sm.Extract_Month) AS Extract_Month,
       S.Staff,
       Sm.MX
FROM (SELECT Extract_Month, COUNT(Employee_Number) as Staff
      FROM Staff
      GROUP BY Extract_Month) S
     FULL OUTER JOIN (SELECT Extract_Month, COUNT(Employee_Number) as MX
                      FROM Staff_mx
                      GROUP BY Extract_Month) Sm ON S.Extract_Month = Sm.Extract_Month;

Я использую FULL OUTER JOIN здесь просто на тот случай, если в одной таблице нет строк для данного Извлечь Месяц.

1 голос
/ 06 апреля 2020

У условной агрегации:

with cte as (
     SELECT Extract_Month, Employee_Number as Staff, 'staff' AS flag
     FROM Staff
     UNION ALL
     SELECT Extract_Month, Employee_Number as Staff, 'mx' AS flag
     FROM Staff_mx
)
SELECT Extract_Month, 
       COUNT(CASE WHEN flag = 'Staff' THEN Employee_Number END) AS Staff,
       COUNT(CASE WHEN flag = 'mx' THEN Employee_Number END) AS mx
FROM cte c
GROUP BY Extract_Month;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...