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

news/发布时间2024/5/17 15:10:32

目录
  • 1.背景说明
  • 2.简单示例

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 *,CASEWHEN (   TimeDiff >= 0AND   TimeDiff < 5) THEN 'H0h~5h'WHEN (   TimeDiff >= 5AND   TimeDiff < 10) THEN 'H5h~10h'WHEN (   TimeDiff >= 10AND   TimeDiff < 15) THEN 'H10h~15h'WHEN (   TimeDiff >= 15AND   TimeDiff < 20) THEN 'H15h~20h'WHEN (   TimeDiff >= 20AND   TimeDiff < 25) THEN 'H20h~25h'WHEN (   TimeDiff >= 25AND   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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/01033643.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

小程序上显示富文本

功能:富文本内容格式化、拿到富文本里的所有图片点击放大图片util.tsexport function formatRichText(html: any) { // 富文本内容格式化let arrText = html;//正则匹配不含style="" 或 style= 的img标签var regex1 = new RegExp("(i?)(\<img)(?!(.*?sty…

TPU-MLIR实现技术详细介绍

TPU-MLIR实现技术详细介绍 TPU-MLIR简介 后文假定用户已经处于docker里面的/workspace目录。 编译ONNX模型 以 yolov5s.onnx 为例, 介绍如何编译迁移一个onnx模型至BM1684X TPU平台运行。 该模型来自yolov5的官网: https://github.com/ultralytics/yolov5/releases/download/v6…

PostgreSQL源码学习 win10源码编译安装

源码学习的第一步是源码安装,只有用源码安装才能之后在此基础上阅读、调试、开发系统。 我这里安装的是PostgreSQL 13.2版本,其他版本大同小异,如有出入,以最新版本的文档为准:PostgreSQL最新版文档 一、下载源码 源码下载链接,内含各自版本的源码:PG源码 比如13.2版本的…

结对编程 300道四则运算

小学老师要每周给同学出300道四则运算练习题。 –这个程序有很多种实现方式:C/C++ C#/VB.net/Java Excel Unix Shell Emacs/Powershell/Vbscript Perl Python –两个运算符,100 以内的数字,不需要写答案。 –需要检查答案是否正确,并且保证答案在 0..100 之间 –尽可能地多设…

基于yolov2深度学习网络的螺丝螺母识别算法matlab仿真

1.算法运行效果图预览 2.算法运行软件版本 matlab2022a3.算法理论概述在工业自动化和质量控制领域,准确且高效的螺丝螺母识别至关重要。深度学习方法,特别是基于卷积神经网络(CNN)的目标检测技术,因其卓越的特征提取能力,成为解决此类问题的有效手段。YOLOv2作为实时目标…

进阶数据结构

学到哪写到哪说是 既然打ACM可以用板子,我就不用再隔几天敲一遍板子了 只能说赢麻了 线段树 线段树是一种利用二分思想的数据结构,主要用于区间修改以及查询问题。 它的基本思想是可以用一下一个图来表示,其中最底层的是原数组简单来说,对于每个区间的修改或者查询操作,我…