首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL按日期分组,但也得到没有记录的日期

您好!您的问题是关于如何在 SQL 查询中按日期分组,同时也获取没有记录的日期。

在 SQL 查询中,您可以使用 GROUP BY 子句将结果按照指定的日期字段进行分组。如果您想要获取没有记录的日期,您可以使用一个日期表来生成所有可能的日期,然后将其与您的查询结果进行连接。

例如,假设您有一个名为 orders 的表,其中包含 order_dateorder_amount 字段。您可以使用以下查询来按日期分组,并获取没有记录的日期:

代码语言:sql
复制
WITH date_range AS (
  SELECT DATE(NOW()) - INTERVAL (a.N + (10 * b.N) + (100 * c.N) + (1000 * d.N)) DAY AS date
  FROM (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a
  CROSS JOIN (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b
  CROSS JOIN (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c
  CROSS JOIN (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d
),
orders_with_dates AS (
  SELECT date_range.date, SUM(orders.order_amount) AS total_amount
  FROM date_range
  LEFT JOIN orders ON DATE(orders.order_date) = date_range.date
  GROUP BY date_range.date
)
SELECT orders_with_dates.date, orders_with_dates.total_amount
FROM orders_with_dates
WHERE orders_with_dates.date BETWEEN DATE(NOW()) - INTERVAL 30 DAY AND DATE(NOW())
ORDER BY orders_with_dates.date ASC;

在这个查询中,我们首先创建了一个名为 date_range 的临时表,其中包含了从当前日期往前 30 天的所有可能日期。然后,我们将 orders 表与 date_range 表进行左连接,并按日期分组,计算每个日期的订单总金额。最后,我们选择了最近 30 天的日期和订单总金额,并按日期升序排序。

这个查询可以帮助您获取指定日期范围内的所有日期,包括没有记录的日期,并按日期分组计算订单总金额。您可以根据您的需求修改这个查询,以适应您的具体情况。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL面试题库」 No_115 日期分组销售产品

今日真题 题目介绍: 日期分组销售产品 group-sold-products-by-the-date 难度简单 SQL架构 表 Activities : +-------------+-...--------+---------+ | sell_date | date | | product | varchar | +-------------+---------+ 此表没有主键...此表每一行都包含产品名称和在市场上销售日期。 编写一个 SQL 查询来查找每个日期、销售不同产品数量及其名称。 每个日期销售产品名称应按词典序排列。...返回 sell_date 排序结果表。 查询结果格式如下例所示。...对于2020-06-01,出售物品是 (Pencil, Bible),词典序排列,并用逗号分隔。 对于2020-06-02,出售物品是 (Mask),只需返回该物品名。

19330
  • 3分钟短文 | Laravel SQL筛选两个日期之间记录,怎么写?

    学习时间 假设有一个模型 Reservation,我们查询某个日期预订条目数,首先构造日期字符串,使用内置函数: $now = date('Y-m-d'); 返回当前日期。...然后调用模型 where 查询语句: $reservations = Reservation::where('reservation_from', $now)->get(); 上一条生成SQL语句如下...('reservation_from', [$from, $to])->get(); 这样就返回SQL查询 BETWEEN ......当然了,上面的方法是在SQL中直接进行筛选,如果查询结果限制条目本身比较少,也能充分利用索引,所以不担心查询速度,那么我们可以在查询完成后,在返回 Eloquent Collection 集合上,...如果考虑初始查询条件圈定记录条目过多,会对MySQL造成流量压力,那么在SQL阶段直接筛选出最精准记录,无疑是个好习惯。whereBetween 在模型里链式调用毫无压力: ?

    3.3K10

    图解面试题:如何分析红包领取情况?

    【题目】 “用户活跃表”记录了用户登录信息,包括用户标识、用户登录日期,以及是否是新用户(如果是新注册用户值为1;如果是老用户,值为0)。...“领取红包表”里记录了用户领取红包信息,包括抢红包日期、抢红包时间、用户ID、领取红包金额。...当出现“每天”要想到《猴子 从零学会sql》里讲过分组汇总来解决这样问题。 用“日期”来分组(group by),用count(用户ID)来汇总登录用户。...代入上面sql,就得到了: select n.抢红包日期,n.用户ID,n.金额,(case when m.新用户=1 then 新用户 when m.新用户=0 then 老用户...【分析思路】 领取红包用到表是“领取红包”表。出现“每个月”这样字眼,和就要想到用分组汇总来解决此类问题,“月份”分组。 使用month(日期)获取月份。

    1.3K20

    告别宽表,用 DQL 成就新一代 BI

    较少见 第四种维度对齐,稍有特殊,但也没有超出前三种情况范围,所以我们说成3+1 这里说是BI中JOIN,并不是SQL中全部JOIN,有些关联计算仍然需要原始JOIN定义来描述,比如做矩阵乘法...,SELECT后直接再加字段就可以了 维对齐 这里有三个表:合同表、回款表和库存表 我们希望日期统计合同额、回款额和库存金额 用SQL写出来是这样: SELECT T1.日期,T1.金额,T2....T3 ON T2.日期=T3.日期 用子查询把每个表分组汇总后再JOIN起来,如果偷懒不用子查询先JOIN后GROUP,那结果是错误,统计值会变多。...中,只要把这几个表分别日期对齐分别汇总就行了,而不必关心这些表之间关系,在增删表时也不容易发生遗漏 如果维对齐再与外键搅到一起,情况就会更复杂: 我们希望地区统计销售员人数和合同额 用SQL写出来是这样...因为对 JOIN 理解不再是以笛卡尔积为基础,而且设计这些语法时已经假定了多对多关联没有业务意义,这个规则下写不出完全叉乘运算 对于多个子表分组后与主表对齐运算,在 SQL 中要写成多个子查询形式

    1.2K10

    时间问题,你会吗?

    某店铺商品信息表中记录了有哪些商品 订单明细表中记录了商品销售流水;"订单明细表"中'商品ID' 与"商品信息表"中'商品ID'一一对应。...)根据间隔周数条件分组 1.计算当前日期与支付时间相隔周数 设计到日期,要能想到《猴子从零学会SQL》里讲过日期函数。...常用计算日期函数有俩datediff和timestampdiff。具体用法如下: 这里使用timestampdiff函数可以直接计算两个日期相差周数。...而更新表,需要使用update函数,SQL语法如下 update set = 用下面SQL就可以得到当前日期与支付时间相隔周数 update 订单明细表...set 间隔周数 = (timestampdiff(WEEK,支付时间,NOW())); 查询结果: 2.根据间隔周数条件分组 可以使用case when 条件表达式,对间隔周数条件进行分组

    93720

    游戏行业实战案例2:玩家等级

    “登录日志”记录各玩家登录时间和登录时角色等级。 “登出日志”记录各玩家登出时间和登出时角色等级。 其中,“角色id”字段唯一识别玩家。...也就是说,我们可以把“登出日志”和“登录日志”纵向联结,然后再通过联结后表对每个玩家登录或登出时间进行排序,从而筛选出每个玩家最后一次时间下等级。...对每个玩家按时间排序即是分组排序,使用排序窗口函数即可实现。即:以角色id进行分组(partition by 角色id),以时间进行排序(order by 时间),获取每个玩家下每个时间排名。...where 日期 = '2022-08-13') as a; 查询结果如下: 将上述查询结果设为临时表b,从该临时表中筛选出排名为1(where 排名 = 1)数据即可得到玩家停留等级信息。...计算各等级停留角色数分为两步: 第一步,对各停留角色等级进行分组; 第二步,分组后,计算各等级角色数。

    1K30

    告别宽表,用 DQL 成就新一代 BI

    稍有特殊,但也没有超出前三种情况范围,所以我们说成3+1 这里说是BI中JOIN,并不是SQL中全部JOIN,有些关联计算仍然需要原始JOIN定义来描述,比如做矩阵乘法,但在BI中碰不到 我们针对这...,SELECT后直接再加字段就可以了 维对齐 这里有三个表:合同表、回款表和库存表 我们希望日期统计合同额、回款额和库存金额 用SQL写出来是这样: SELECT T1.日期,T1.金额,T2....T3 ON T2.日期=T3.日期 用子查询把每个表分组汇总后再JOIN起来,如果偷懒不用子查询先JOIN后GROUP,那结果是错误,统计值会变多。...中,只要把这几个表分别日期对齐分别汇总就行了,而不必关心这些表之间关系,在增删表时也不容易发生遗漏 如果维对齐再与外键搅到一起,情况就会更复杂: 我们希望地区统计销售员人数和合同额 用SQL写出来是这样...因为对 JOIN 理解不再是以笛卡尔积为基础,而且设计这些语法时已经假定了多对多关联没有业务意义,这个规则下写不出完全叉乘运算 对于多个子表分组后与主表对齐运算,在 SQL 中要写成多个子查询形式

    82020

    分享几道LeetCode中MySQL题目解法

    解决此问题关键在于: 查询出每个用户首次登录日期 在首次登录日期基础上,查询用户次日登录情况 查询首次登录日期相对简单,仅需按用户分组、查询其最早日期即为首次登录日期;而直接查询次日登录情况则并不容易...毫无疑问,思路仍然是先查找用户首日信息,进而通过左连接查询次日登录情况,再根据日期分组聚合统计即可。...首先,直觉是要进行分组统计,目标是得到每个用户、每个消费日期交易记录数目及平台,其中交易记录数目=2时,平台为both;否则平台为相应desktop或mobile。...得到这一查询结果并不难,仅需按用户和消费日期分组聚合并判断记录条目选择平台字段即可: 1SELECT user_id, spend_date, 2 IF(count( platform )...在此基础上,由于最终目标是要查询每个交易日用户数和交易总额,所以意味着对该结果进一步消费日期进行分组聚合。但实际上,如果简单这样分组统计必然会存在有些交易日不是所有平台都有结果。

    2K20

    神奇 SQL ,同时实现小计与合计,阁下该如何应对

    ,例如在 PostgreSQL 实现小计与合计     主流关系型数据库( Oracle 、 SQL Server 、 DB2 、 PostgreSQL )都是 SQL 标准来实现     唯独...MySQL 没有标准来,她发挥了她小任性,用 WITH ROLLUP 坚持了自己个性   2、 GROUPING 、 ROLLUP ,你认识吗     这是本文重点(呼应开头了),请继续往下看...,也就相当于没有 GROUP BY 子句,这时会得到全部数据 合计行   该合计行记录称为 超级分组记录(super group row) ,虽然听上去很屌,但还是希望大家把它当做未使用 GROUP...  关于懵点 2, Null 看着确实难受,关键是难以区分:到底是值是 Null ,还是超级分组记录 Null   所以为了避免混淆, SQL 标准就规定用 GROUPING 函数来判断超级分组记录...NULL   如果 GROUPING 函数值是 1,则表示是超级分组记录,0 则表示其他情况   我们调整下 SQL SELECT CASE WHEN GROUPING(ware_category

    39010

    抖音面试题:遇到连续问题怎么办?

    image.png 【抖音面试题】 有一张“用户登陆记录表”,包含两个字段:用户id、日期。 image.png 【问题】查询2021年每个月,连续2天都有登陆用户名单。...可以用分组汇总,也就是分组(group by 月,用户id),统计(对分组后每个组计数就是连续登陆天数 count) 2....子查询 1)获取登陆日期天,需要用到day()函数; 2)获取登录日期月,需要用到month()函数; 3)获取每个月登陆顺序,这类问题属于“每个+排序”,要想到用《猴子 从零学会SQL》里讲过知识...1 select distinct 月,用户id 2 from t3 3 where 连续登陆天数 >= 2; 到这里我们已经得到了题目要求结果,可以把前面的子查询t1、t2、t3代入上面的SQL语句...,就得到了最终SQL: 1 select distinct 月,用户id 2 from 3 (select 月,用户id,标记, 4 count(*) as 连续登陆天数 5 from

    1.2K00

    sql语句面试经典50题_sql基础知识面试题

    年出生学生名单 学生表中出生日期类型是datetime */ select 学号,姓名 from student where year(出生日期)=1990; 查询各科成绩前两名记录 这类问题其实就是常见...:分组取每组最大值、最小值,每组最大N条(top N)记录。...as b where b.课程号 = a.课程号); 每组最大N条记录 案例:查询各科成绩前两名记录 第1步,查出有哪些组 我们可以课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号...(desc)得到是每组最大N个记录。...如果对多表合并还不了解,可以看下我讲过《从零学会SQL“多表查询”。 总结 常见面试题:分组取每组最大值、最小值,每组最大N条(top N)记录

    2.9K20

    面试 SQL整理 常见SQL面试题:经典50题

    年出生学生名单 学生表中出生日期类型是datetime */ select 学号,姓名 from student where year(出生日期)=1990; 查询各科成绩前两名记录 这类问题其实就是常见...:分组取每组最大值、最小值,每组最大N条(top N)记录。...as b where b.课程号 = a.课程号); 每组最大N条记录 案例:查询各科成绩前两名记录 第1步,查出有哪些组 我们可以课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号...(desc)得到是每组最大N个记录。...如果对多表合并还不了解,可以看下我讲过《从零学会SQL“多表查询”。 总结 常见面试题:分组取每组最大值、最小值,每组最大N条(top N)记录

    2.3K10

    常见SQL面试题:经典50例

    查询条件 [没有] group by 分组 [每门课程:课程号分组] having 对分组结果指定条件 [没有] order by 对查询结果排序[平均成绩升序排序:asc,平均成绩相同时,课程号降序排列...年出生学生名单 学生表中出生日期类型是datetime */ select 学号,姓名 from student where year(出生日期)=1990; 查询各科成绩前两名记录 这类问题其实就是常见...as b where b.课程号 = a.课程号); 每组最大N条记录 案例:查询各科成绩前两名记录 第1步,查出有哪些组 我们可以课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号...(desc)得到是每组最大N个记录。...如果对多表合并还不了解,可以看下我讲过《从零学会SQL“多表查询”。 总结 常见面试题:分组取每组最大值、最小值,每组最大N条(top N)记录

    6.9K42

    常见SQL面试题:经典50例

    ,如:[每个学生平均:学号分组](oracle,SQL server中出现在select 子句后分组函数,必须出现在group by子句后出现),MySQL中可以不用 having 对分组结果指定条件...datetime */ select 学号,姓名  from student  where year(出生日期)=1990;  查询各科成绩前两名记录 这类问题其实就是常见分组取每组最大值、最小值... as b  where b.课程号 = a.课程号); 每组最大N条记录 案例:查询各科成绩前两名记录 第1步,查出有哪些组 我们可以课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号...(desc)得到是每组最大N个记录。...如果对多表合并还不了解,可以看下我讲过《从零学会SQL“多表查询”。 总结 常见面试题:分组取每组最大值、最小值,每组最大N条(top N)记录

    2K20

    面试中经常被问到 50 个 SQL 题,必须拿下!

    查询条件 [没有] group by 分组 [每门课程:课程号分组] having 对分组结果指定条件 [没有] order by 对查询结果排序[平均成绩升序排序:asc,平均成绩相同时,课程号降序排列...年出生学生名单 学生表中出生日期类型是datetime */ select 学号,姓名 from student where year(出生日期)=1990; 查询各科成绩前两名记录 这类问题其实就是常见...as b where b.课程号 = a.课程号); 每组最大N条记录 案例:查询各科成绩前两名记录 第1步,查出有哪些组 我们可以课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号...(desc)得到是每组最大N个记录。...如果对多表合并还不了解,可以看下我讲过《从零学会SQL“多表查询”。 总结 常见面试题:分组取每组最大值、最小值,每组最大N条(top N)记录

    3.2K30

    快出来,收快递啦

    最终得出数据如下: image.png 【解题步骤】 1. 汇总分析 计算0501-0531期间每个客户单量,涉及到“每个”,要想到《猴子 从零学会SQL》里讲过分组汇总来解决这类问题。...“客户id”分组,对“运单号”统计数目得到单量(count),注意要用distinct对运单号去重。...子查询 在上一步基础上,还无法得到要求“最终结果”。因为,“最终结果”里面获取是不同单量区间客户数量分布。...image.png 在上一步查询结果基础上(作为子查询),再使用一次汇总分析,“单量区间”分组(group by),对客户id汇总得到客户数(count)。...SQL语句,得到“最终结果”: image.png 《猴子 从零学会SQL》里教,把“最终结果”导出到Excel里,对数据进行可视化可以更方便观察数据。

    70100

    平平无奇SQL面试题:经典50例

    查询条件 [没有] group by 分组 [每门课程:课程号分组] having 对分组结果指定条件 [没有] order by 对查询结果排序[平均成绩升序排序:asc,平均成绩相同时,课程号降序排列.../* 查找1990年出生学生名单 学生表中出生日期类型是datetime */ select 学号,姓名 from student where year(出生日期)=1990; 查询各科成绩前两名记录...分组取每组最大值 案例:课程号分组取成绩最大值所在行数据 我们可以使用分组(group by)和汇总函数得到每个组里一个值(最大值,最小值,平均值等)。但是无法得到成绩最大值所在行数据。...每组最大N条记录 案例:查询各科成绩前两名记录 第1步,查出有哪些组 我们可以课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号 select 课程号,max(成绩) as 最大成绩 from...前面我们使用order by子句某个列降序排序(desc)得到是每组最大N个记录。如果想要达到每组最小N个记录,将order by子句某个列升序排序(asc)即可。

    2.5K60
    领券