记一个简单的sql查询

在我们做各类统计和各类报表的时候,会有各种各样的查询要求、条件

这篇主要记录一个常见的统计查询

要求如下:

统计一段时间内,每天注册人数,如果某天没有人注册则显示为0

现在建个简单的表来试试

建表语句如下:

 1 CREATE TABLE [dbo].[UserInfo](
 2     [UserID] [int] IDENTITY(1,1) NOT NULL,
 3     [UserName] [varchar](50) NOT NULL,
 4     [URegTime] [datetime] NOT NULL,
 5  CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED
 6 (
 7     [UserID] ASC
 8 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 9 ) ON [PRIMARY]
10 GO

然后向其插入一些数据

 1 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher1‘,‘2016-03-01 8:00:00‘)
 2 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher2‘,‘2016-03-01 9:00:00‘)
 3 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher3‘,‘2016-03-05 8:00:00‘)
 4 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher4‘,‘2016-03-05 20:00:00‘)
 5 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher5‘,‘2016-03-07 8:00:00‘)
 6 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher6‘,‘2016-03-09 8:00:00‘)
 7 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher7‘,‘2016-03-11 8:00:00‘)
 8 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher8‘,‘2016-03-11 18:00:00‘)
 9 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher9‘,‘2016-03-15 8:00:00‘)
10 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher10‘,‘2016-03-17 8:00:00‘)
11 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher11‘,‘2016-03-17 11:00:00‘)
12 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher12‘,‘2016-03-17 13:00:00‘)
13 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher13‘,‘2016-03-18 8:00:00‘)
14 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher14‘,‘2016-03-19 8:00:00‘)
15 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher15‘,‘2016-03-20 8:00:00‘)
16 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher16‘,‘2016-03-20 11:00:00‘)
17 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher17‘,‘2016-03-20 12:00:00‘)
18 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher18‘,‘2016-03-21 8:00:00‘)
19 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher19‘,‘2016-03-21 9:00:00‘)
20 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher20‘,‘2016-03-22 8:00:00‘)
21 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher21‘,‘2016-03-22 12:00:00‘)
22 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher22‘,‘2016-03-26 8:00:00‘)
23 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher23‘,‘2016-03-26 10:00:00‘)
24 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher24‘,‘2016-03-26 11:00:00‘)
25 INSERT INTO [dbo].[UserInfo]([UserName],[URegTime])VALUES(‘catcher25‘,‘2016-03-26 20:00:00‘)

下面来看看编写符合要求的sql查询

 1 select b.regTime,userCount =isnull(a.userCount,0)
 2 from
 3 (
 4 select regTime=convert(varchar(10),dateadd(dd,number,‘2016-03-01‘),120)
 5 from master..spt_values
 6 where type=‘p‘  and number <= datediff(dd,‘2016-03-01‘,GETDATE())
 7 ) b
 8 left join
 9 (
10 select
11 userCount = COUNT(*),
12 regTime = CONVERT(varchar(4),YEAR(u.URegTime))+‘-‘ +right(cast(month(u.URegTime)+100 as varchar),2) +‘-‘+right(cast(Day(u.URegTime)+100 as varchar),2)
13 from UserInfo u
14 group by YEAR(u.URegTime),Month(u.URegTime),Day(u.URegTime)
15 ) a  on a.regTime  = b.regTime

来看看结果,左边是原始数据,右边是统计数据

        

思路很简单,找出这段时间范围内(2016年3月1号到今天)的所有日期去跟我们相应的数据进行左连接即可!

其中用到了一个系统常量表 master..spt_values

一些相关这个表的具体内容可以看看下面的文章

Master..spt_values system table

SQLServer——MASTER..spt_values

SQL Server 中master..spt_values的应用

时间: 2024-12-26 09:05:45

记一个简单的sql查询的相关文章

一个有趣的 SQL 查询(查询7天连续登陆)

一个有趣的 SQL 查询 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: *************************** 1. row *************************** Field: uid Type: int(10) unsigned Null: NO Key: MUL Default: NULL Extra: *************************** 2.

tp5 r3 一个简单的SQL语句调试实例

tp5 r3 一个简单的SQL语句调试实例先看效果核心代码 public function index() { if (IS_AJAX && session("uid")==1){ $sql=input("post.sql"); $sql=base64_decode($sql); if ($sql){ if (preg_match('/INSERT INTO|DELETE|UPDATE\s/i', $sql, $info)){ $result=\th

初识Winform 与C#----一个简单涉及SQL数据库的通讯录 (Contact3)

一.  关于Winform 启动程序和显示窗体--------------------------------[Program.cs]------------------用来启动程序,显示最基础的窗体 Winfom(窗体)中的许多控件------------------------[form1.cs]---------------------用来定义控件窗体,及其中的对象, ------[form1.Designer.cs]----------定义窗体及其中的对象的行为,即函数,或者方法. 控件

记一个简单的保护if 的sh脚本

真是坑爹,就下面的sh,竟然也写了很久! if [ `pwd` != '/usr/xx/bin/tomcat' ] then echo "rstall is not allowed in current dir : `pwd` !" return fi ./bin/rstmst.sh;../tomcat-bb/bin/rstns.sh if 的语法真麻烦, linux if 的语法真是服了! if 后面跟的是 [] ,  而不是 ()  擦! if 和 then 之间必须换行! ———

记一个简单的序列化

package com.atguigu.mapreduce.flowsum; import java.io.DataInput;import java.io.DataOutput;import java.io.IOException; import org.apache.hadoop.io.Writable; public class FlowBean implements Writable{ private long upFlow; // 上行流量 private long downFlow;

spring MVC +freemarker + easyui 实现sql查询和执行小工具总结

项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍开发使用过程.首先看图:大概的操作界面,基本使用easyui组件实现,欢迎大家吐槽: 界面包含了基本的sql查询 和 sql执行的小功能,把查询和执行分开,也是为了后台实现的需要,以及权限控制的考虑,毕竟执行的操作,会影响到系统的数据问题.查询和执行的菜单,是用easyui的手风琴式的菜单处理的.两

sql查询学习和实践点滴积累

SQL是关系数据库中非常基础同时也是非常重要的知识,虽然比如类似Laravel的后端开发类库提供了ORM抽象数据类封装掉了一部分简单的sql查询,因此很多时候我们无需关系sql的具体细节,便能非常快速地开发出自己的后端应用来,但是一旦涉及到相对比较复杂的关系时我们还是不得不再去求助于sql.本博作为鸡年新年刚过,起个开端,不断记录积累本人在sql学习中觉得重要的点点滴滴,学习资源,备忘的同时,也希望给有缘人以帮助 SQL Subselect and correlated subquery sub

[MySQL5.6] 一个简单的optimizer_trace示例

[MySQL5.6] 一个简单的optimizer_trace示例 前面已经介绍了如何使用和配置MySQL5.6中optimizer_trace(点击博客),本篇我们以一个相对简单的例子来跟踪optimizer_trace的产生过程. 本文的目的不是深究查询优化器的实现,只是跟踪optimizer trace在优化器的那一部分输出,因此很多部分只是一带而过,对于需要深究的部分,暂时标注为红色,后续再扩展阅读;之前一直没看过这部分代码,理解起来还是比较困难的… 我们以一个简单的表为例过一下opti

搭建一个简单的mybatis框架

一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 1.Mybatis实现了接口绑定,使用更加方便. 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Myb