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('') as Dates,a.ProductName,a.年,t.number 月 from (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
参考资料: