【问题标题】:How to merge two select queries with the correct groups?如何将两个选择查询与正确的组合并?
【发布时间】:2022-11-30 19:04:00
【问题描述】:

我有带有 end_date 列的用户表,如果用户处于活动状态,则该列为 NULL,如果用户不再处于活动状态,则它具有日期时间

我想对来自同一国家和城市的用户进行分组,并显示有关 active 用户的信息,以及另一列 non-active 用户,但仅显示过去 12 个月的非活跃用户。

我有 2 个单独的查询:

  1. 对于活跃用户:

    SELECT SUM(CASE WHEN end_date IS NULL THEN 1 ELSE 0 END) AS active, country, city
    FROM user_data_table
    GROUP BY country, city
    
  2. 对于过去 12 个月的非活跃用户:

    SELECT SUM(CASE WHEN end_date IS NULL THEN 0 ELSE 1 END) AS not_active, country, city    
    FROM user_data_table
    WHERE end_date BETWEEN ? AND ?
    GROUP BY country, city
    

    我试过 Unions 但没有用,我试过子查询但也没有用

    结果应该是这样的:

      country   |    city   | active(all time) | not active(past year)
    ------------|-----------|------------------|-----------------------
    Sweden      | Stockholm |        25        |           1
    Switzerland |   Bern    |        43        |           13
    

【问题讨论】:

  • 你不能把两个 SUM(CASE) 放在同一个 SELECT 语句中吗?您需要将 end_date 范围放在 CASE 中而不是 WHERE 子句的一部分

标签: sql sql-server


【解决方案1】:

有很多方法可以做到这一点

这是许多可能的方法之一

解决方案 1:

SELECT SUM(CASE WHEN end_date IS NULL THEN 1 ELSE 0 END) AS active, SUM(CASE WHEN end_date end_date BETWEEN ? AND ? THEN 1 ELSE 0 END) AS not_active, country, city    
FROM user_data_table

GROUP BY country, city

因为您要求合并两个不相关的请求,所以我疯狂地假设您在问题中提供的是一个简单版本,在这种情况下您确实需要合并这两个请求。你有这种合并他们两个的方式

解决方案 2:

WITH B
As(
    SELECT SUM(CASE WHEN end_date IS NULL THEN 0 ELSE 1 END) AS not_active, country, city    
FROM user_data_table
WHERE end_date BETWEEN ? AND ?
GROUP BY country, city

);

Select A.*, B.not_active FROM(
SELECT SUM(CASE WHEN end_date IS NULL THEN 1 ELSE 0 END) AS active, country, city
FROM user_data_table 
GROUP BY country, city
) A
INNER JOIN B ON A.country = B.country and A.city = B.city

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 2013-02-17
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多