首页 > 数据库 >T-SQL——关于时间段类报表

T-SQL——关于时间段类报表

时间:2024-04-17 11:22:42浏览次数:20  
标签:OrderId 00 Name 2024 时间段 SQL CreateTime SELECT 报表

目录

shanzm-2024-4-3 11:11:20

1.背景说明

  • 需要查询一个以时间段为列的报表
  • 可以筛选除各个时间段进行连接查询出来
  • 可以通过 Case When 将时间差转为时间段,在进行转列


2.简单示例


--各个品牌尚未发货的订单,从订单创建时间到当前时间的各个时间段的数量
WITH OrdersTable AS 
(
SELECT NEWID() AS OrderId, 'Brand1' AS Name  ,'2024-4-17 01:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 01:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 06:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 06:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 11:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 11:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 16:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 16:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 21:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand1' AS Name  ,'2024-4-17 21:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId, 'Brand2' AS Name  ,'2024-4-17 01:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 01:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 06:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 06:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 11:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 11:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 16:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 16:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 21:10:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-17 21:20:00' AS CreateTime 
UNION ALL	
SELECT NEWID() AS OrderId,'Brand2' AS Name  ,'2024-4-16 08:20:00' AS CreateTime 	
)
,temp1 AS 
(
--第一步:算出订单与当前时间的差值(这个使用'2024-4-18 00:00:00'作为当前时间)
SELECT * , DATEDIFF(HOUR, OrdersTable.CreateTime, '2024-4-18 01:00:00') AS TimeDiff FROM  OrdersTable 
)
,temp2 AS (
--第二步:使用CASE WHEN 将时间差值转为时间段
SELECT *,CASE
         WHEN (   TimeDiff >= 0
            AND   TimeDiff < 5) THEN 'H0h~5h'
         WHEN (   TimeDiff >= 5
            AND   TimeDiff < 10) THEN 'H5h~10h'
         WHEN (   TimeDiff >= 10
            AND   TimeDiff < 15) THEN 'H10h~15h'
         WHEN (   TimeDiff >= 15
            AND   TimeDiff < 20) THEN 'H15h~20h'
         WHEN (   TimeDiff >= 20
            AND   TimeDiff < 25) THEN 'H20h~25h'
         WHEN (   TimeDiff >= 25
            AND   TimeDiff < 30) THEN 'H25h~30h'
         ELSE 'Greater30' END PeriodOfTime FROM	 temp1
)
,temp3 AS 
(
--第三步:按时间段和品牌聚合求Count
SELECT temp2.Name,temp2.PeriodOfTime,COUNT(temp2.OrderId) AS OrderCount  FROM  temp2 GROUP	 BY	 Name,PeriodOfTime
)
,temp4 AS 
(
--第四步:行转列
SELECT T.Name,T.[H0h~5h],T.[H5h~10h],T.[H10h~15h],T.[H15h~20h],T.[H20h~25h],T.Greater30
FROM  temp3 PIVOT (SUM(OrderCount) FOR	PeriodOfTime IN([H0h~5h],[H5h~10h],[H10h~15h],[H15h~20h],[H20h~25h],[Greater30]))T
) 
SELECT * FROM  temp4

Name   H0h~5h      H5h~10h     H10h~15h    H15h~20h    H20h~25h    Greater30
------ ----------- ----------- ----------- ----------- ----------- -----------
Brand1 2           2           2           2           2           NULL
Brand2 2           2           2           2           2           1

标签:OrderId,00,Name,2024,时间段,SQL,CreateTime,SELECT,报表
From: https://www.cnblogs.com/shanzhiming/p/18140135

相关文章

  • 如何使用pgloader迁移MySQL数据库至openGauss
    pgloader介绍pgloader是一个数据导入工具,使用COPY命令将数据导入到PostgreSQL。pgloader有两种工作模式,一种是从文件导入,一种是迁移数据库。pgloader在两种情况下都使用PostgreSQL的COPY协议高效的传输数据。openGauss兼容PostgreSQL的通信协议以及绝大部分语法,可......
  • MySQL存储引擎
    MySQL存储引擎存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以称为表类型。查看存储引擎showengines;查看数据库默认存储引擎showvariableslike'%storage_engine%';MySQL存储引擎特性MySQL5.5之前......
  • GreatSQL优化技巧:半连接(semijoin)优化
    何为半连接?半连接是在GreatSQL内部采用的一种执行子查询的方式,semijoin不是语法关键字,不能像使用innerjoin、leftjoin、rightjoin这种语法关键字一样提供给用户来编写SQL语句。两个表t1表和t2表进行半连接的含义是:对于t1表的某条记录来说,我们只关心在t2表中是否存在与之匹配......
  • MySQL的架构以及SQL的执行过程
    MySQL主要分为Server层和存储引擎层Server层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块binlog日志模块。存储引擎:主要负责数据的存储和读取,采用可以替换的插件式架构......
  • MySQL体系结构
    MySQL体系结构连接层客户端连接器连接器负责与客户端建立连接,处理客户端发送的请求,并将结果返回给客户端。连接池连接池用于管理数据库连接,提高数据库的并发处理能力和性能。服务层管理工具管理工具用于监控和管理MySQL服务器,包括配置管理、性能调优、安全管理等功能。S......
  • 强!一款贼好用的低代码报表工具,开源免费!
    大家好,我是狂师!今天给大家推荐一款免费的数据可视化报表设计工具:JimuReport,类似excel操作风格,在线拖拽完成报表设计!项目号称:功能永久免费、可以商用、永久免费使用!1、JimuReport介绍JimuReport是北京国炬信息技术有限公司旗下的平台,是一款免费的数据可视化报表工具,主要用于报表......
  • MySQL触发器
    MySQL触发器触发器是预先定义的一段SQL语句,当在某个表上执行INSERT/UPDATE/DELETE操作之前或之后,会自动执行触发器。创建触发器CREATETRIGGERtrigger_nameAFTER/BEFOREINSERT/UPDATE/DELETEONtable_nameFOREACHROWBEGIN--触发器操作的SQL语句END;查看触发器......
  • MySQL存储过程与函数
    MySQL存储过程与函数存储过程创建、调用、删除创建CREATEPROCEDURE存储过程名(参数列表)BEGIN--SQL语句END;调用CALL存储过程名(参数值);删除DROPPROCEDUREIFEXISTS存储过程名;函数创建、调用、删除创建CREATEFUNCTION函数名(参数列表)RETURNS返......
  • MySQL游标
    MySQL游标创建游标DECLAREcursor_nameCURSORFORselect_statement;使用游标OPEN光标OPENcursor_name;FETCH光标FETCHcursor_nameINTOvar_name[,var_name]...CLOSE光标CLOSEcursor_name;循环获取游标DECLAREemp_reaultcursorforselect*fromemp;D......
  • Mysql低版本中处理row_number()函数的适配问题
    在最近的项目中遇到了mysql8.0版本中row_number()函数在迁移数据库低版本mysql5.0版本无法使用的问题。具体sql如下:1SELECTDATE(a.CRETIFICATE_DATE)ASNAME,COUNT(*)ASCOUNTFROM2(SELECTCERTIFICATE_DATE,ENABLED,CERTIFICATION_STATE,ROW_NUMBER()over(PARTIT......