【问题标题】:combining multiple count queries in sql在sql中组合多个计数查询
【发布时间】:2017-02-22 19:38:03
【问题描述】:

我有一个用户表,其中包含 3 列,我试图对其进行计数,然后按 created_at 日期分组。

列:“created_at”、“answers_count”、“questions_count”

如何将这 3 个查询合并为一个,并将所有计数按相同的 created_at 日期分组?

这里有 3 个单独的查询:

-- daily new signups
SELECT date_trunc('day', users.created_at) AS signup_date, count(*) AS new_users
FROM users
GROUP BY signup_date
ORDER BY signup_date DESC;

-- new user answers_count by signup date
SELECT date_trunc('day', users.created_at) AS signup_date, count(*) AS answers_count
FROM users
WHERE users.answers_count > 0
GROUP BY signup_date
ORDER BY signup_date DESC;

-- new user questions_count by signup date 
SELECT date_trunc('day', users.created_at) AS signup_date, count(*) AS qs_received
FROM users
WHERE users.questions_count > 0
GROUP BY signup_date
ORDER BY signup_date DESC;

【问题讨论】:

  • 您正在使用哪个数据库..? mysql还是postgresql?

标签: mysql sql postgresql


【解决方案1】:

您应该尝试使用SUM()CASE 来完成此操作。

试试这样的:

SELECT date_trunc('day', users.created_at) AS signup_date, 
  count(*) AS new_users,
  sum(case when answers_count > 0 then 1 else 0 end) as answers_count,
  sum(case when questions_count > 0 then 1 else 0 end) as qs_received,
FROM users
GROUP BY signup_date
ORDER BY signup_date DESC;

【讨论】:

    【解决方案2】:

    您可以尝试使用countFILTER 来执行此操作。

    SELECT date_trunc('day', users.created_at) AS signup_date, 
      count(*) AS new_users,
      count(*) FILTER (WHERE answers_count > 0) as answers_count,
      count(*) FILTER (WHERE questions_count > 0) as qs_received,
    FROM users
    GROUP BY signup_date
    ORDER BY signup_date DESC;
    

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 2018-07-15
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多