Mysql 从每天的多个where条件中选择计数日期

Mysql 从每天的多个where条件中选择计数日期,mysql,sql,Mysql,Sql,我有很多优惠券。我想了解用户每天从每个活动中收到多少优惠券。但是我不能为每一个选择的行写类似于分配的日期这样的东西 SELECT count(id) as number_of_coupons, DATE_FORMAT(assigned_date, '%d-%m-%Y') as date, (SELECT COUNT(id) FROM

我有很多优惠券。我想了解用户每天从每个活动中收到多少优惠券。但是我不能为每一个选择的行写类似于分配的日期这样的东西

SELECT count(id)                                                  as number_of_coupons,
       DATE_FORMAT(assigned_date, '%d-%m-%Y')                     as date,
       (SELECT COUNT(id) FROM coupon WHERE campaign_id = 1 AND assigned_date=THIS MUST BE SOMETHING) as campaign_1,
       (SELECT COUNT(id) FROM coupon WHERE campaign_id = 2 AND assigned_date=THIS MUST BE SOMETHING) as campaign_2
FROM coupon
GROUP BY DATE_FORMAT(assigned_date, '%d-%m-%Y')
order by STR_TO_DATE(date, '%d-%m-%Y') DESC
所以结果会是这样的。我怎样才能达到这个结果

+-------------------+------------+-------------+-----------+
| number of coupons |    date    |  campaign_1 | campaign2 |
+-------------------+------------+-------------+-----------+
|               156 | 12-10-2019 |        6980 |       100 |
|               177 | 11-10-2019 |        6980 |       100 |
|                44 | 10-10-2019 |        6980 |       100 |
|                94 | 09-10-2019 |        6980 |       100 |
|                93 | 08-10-2019 |        6980 |       100 |
+-------------------+------------+-------------+-----------+

由于不知道您的数据结构是什么样子,我只能推测解决方案应该是什么。但是,我猜下面这样的查询是您想要的:

SELECT COUNT(DISTINCT cv.id) as number_of_coupons,
       DATE_FORMAT(cv.assigned_date, '%d-%m-%Y') as date,
       SUM(CASE WHEN c.campaign_id = 1 THEN 1 ELSE 0 END) as campaign_1,
       SUM(CASE WHEN c.campaign_id = 2 THEN 1 ELSE 0 END) as campaign_2
FROM coupon_vault cv LEFT JOIN
     coupons c
     ON cv.coupon_id = c.coupon_id
GROUP BY DATE_FORMAT(cv.assigned_date, '%d-%m-%Y')
ORDER BY MIN(cv.assigned_date);
很可能,
COUNT(DISTINCT)
是不必要的,
COUNT()
就足够了


Postgres和MySQL(您的原始标签)都有合理的
SUM(CASE…
替代方案。但是,您尚未指定数据库,因此我坚持使用在这两个数据库中都适用的代码。

请提供示例数据和所需结果。我还删除了不兼容的数据库标记。请仅标记您实际使用的数据库。您阅读了我的问题吗?你都明白了。问题是它给了我每天相同的campaing_1 campaing_2值。它们一定完全不同。为什么SUM可以正常工作,但COUNT给出相同的campaign\u 1 campaign\u 2计数?