首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL group by包含空行

MySQL group by包含空行
EN

Stack Overflow用户
提问于 2018-01-23 09:12:19
回答 1查看 79关注 0票数 0

我有一个查询,它使用日程表来获取该月每天的订单数。这包括订购的产品的面值及其发行的总金额。

代码语言:javascript
复制
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条记录需要处理(这些记录在结果集中显示正确。

为什么要包含第一行,如何删除它?

EN

回答 1

Stack Overflow用户

发布于 2018-01-23 09:23:09

您的left join将所有行都保留在calendar中。对于任何不匹配的行,将保留rewards中的列。。。但是列是NULL的。这样的行将是用户1没有奖励的日期。

您的聚合密钥在rewards上,因此不匹配的密钥为NULL

SQL正在做它应该做的事情。您可能只想要一个inner join

我认为如果没有calendar表,您的查询会更简单:

代码语言:javascript
复制
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)上的索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48392719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档