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计数?