【问题标题】:Combine results from 2 SQL queries合并 2 个 SQL 查询的结果
【发布时间】:2020-04-06 12:00:02
【问题描述】:

我想比较两个具有相似数据的表。以下查询提供了每个表中的员工数量:

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

任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server join union


    【解决方案1】:

    你可以使用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 JOINCOALESCE()

    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;
    

    【讨论】:

    • 完美!像魅力一样工作,谢谢。 JOIN是一种什么样的join?
    • 一个INNER JOIN@PhilCollins。
    【解决方案2】:

    做条件聚合:

    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;
    

    【讨论】:

      【解决方案3】:

      也许你想要的是这样的:

      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只是,以防一个表在给定的提取月份中没有任何行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多