SQL自动补充其他月份为0

create table ProductSale(ID int identity(1,1) primary key,ProductName nchar(10), Sales int,Dates datetime)
insert into ProductSale
select  'A',100,'2014-01-05'
UNION ALL
select  'A',200,'2014-02-05'
UNION ALL
select  'A',300,'2014-03-05'
UNION ALL
select  'B',100,'2014-01-05'
UNION ALL
select  'B',300,'2014-03-05'
UNION ALL
select  'B',400,'2014-04-05'
select row_number() over (order by b.年) as ID , b.ProductName,ISNULL(c.Sales,0) Sales,b.Dates from (select rtrim(a.年)+'-'+rtrim(t.number)+'-'+rtrim('01') as Dates,a.ProductName,a.年,t.numberfrom (SELECT distinct YEAR(Dates) as 年,ProductName from ProductSale) a,master..spt_values t  where t.type='p' and t.number>=1 and t.number<=12) b left join ProductSale as c on b.年=YEAR(c.Dates) and b.月=MONTH(c.Dates) and b.ProductName=c.ProductName

运行SQL语句之前:

运行SQL语句之后:

知识点

1、获取日期的年份、月份(GetDate() = '2006-11-08 13:37:56.233')

MONTH ( date )返回表示指定日期的“月”部分的整数。SELECT MONTH(GETDATE()) --返回11

YEAR ( date )返回表示指定日期的“年”部分的整数。SELECT YEAR(GETDATE()) --返回2006

2、master..spt_value表的含义

相当于一个数字辅助表(master.dbo.spt_value),master是数据名,spt_value是表名,在sql中主要用到number字段。

3、sql创建表,自动增长字段IDENTITY

语法:IDENTITY(seed,increment) 

参数:seed 加载到表中的第一个行所使用的值;

increment 与前一个加载的行的标识值想家的增量值。

create table ProductSale(ID int identity(1,1) primary key)

4、连接字段

如果字段都是CHAR型,直接用“+”连接;如果地段都是INT型,用CASE函数转换下,即case(字段名 as varchar(4) ),rtrim()函数,将字符串尾部的空格去掉。

5、sql语句实现断号问题(ROW_NUMBER函数)

row_number() over (order by b.年 ) as  ID

 

参考资料:

 http://bbs.csdn.net/topics/390656141

 http://s.yanghao.org/program/viewdetail.php?i=347818

 

posted @ 2014-03-07 17:21  橙子819  阅读(3058)  评论(0编辑  收藏  举报