我有一个查询,它使用日程表来获取该月每天的订单数。这包括订购的产品的面值及其发行的总金额。
SELECT
reward.denomination,
SUM(CASE WHEN dateCreated IS NULL THEN 0 ELSE 1 END) as totalRewards,
SUM(reward.denomination) as totalIssued
FROM
calendar as c
LEFT JOIN reward
ON DAY(reward.dateCreated) = c.cday
AND MONTH(reward.dateCreated) = c.cmonth
AND YEAR(reward.dateCreated) = c.cyear
AND reward.userID = 1
WHERE
c.cmonth = MONTH(CURRENT_DATE())
AND
c.cyear = YEAR(CURRENT_DATE())
AND
c.cday <= DAY(CURRENT_DATE())
GROUP BY reward.denomination
ORDER BY reward.denomination ASC

在此输出中,第一行显示总奖励的0,然后显示其他两列的null。
但是,总共只有4条记录需要处理(这些记录在结果集中显示正确。
为什么要包含第一行,如何删除它?
发布于 2018-01-23 09:23:09
您的left join将所有行都保留在calendar中。对于任何不匹配的行,将保留rewards中的列。。。但是列是NULL的。这样的行将是用户1没有奖励的日期。
您的聚合密钥在rewards上,因此不匹配的密钥为NULL。
SQL正在做它应该做的事情。您可能只想要一个inner join。
我认为如果没有calendar表,您的查询会更简单:
SELECT r.denomination, COUNT(*) as totalRewards,
SUM(r.denomination) as totalIssued
FROM reward r
WHERE r.userID = 1 AND
r.dateCreated <= CURRENT_DATE() AND
r.dateCreated >= CURRENT_DATE() - INTERVAL (1 - DAY(CURRENT_DATE()) DAY
GROUP BY r.denomination
ORDER BY r.denomination ASC;除了简化查询之外,这还允许您使用更简单的日期算法。作为额外的好处,这可以利用rewards(userId, dateCreated)上的索引。
https://stackoverflow.com/questions/48392719
复制相似问题