create table PRoductSale(ID int identity(1,1) primary key,ProductName nchar(10), Sales int,Dates datetime)
insert into ProductSaleselect 'A',100,'2014-01-05'UNION ALLselect 'A',200,'2014-02-05'UNION ALLselect 'A',300,'2014-03-05'UNION ALLselect 'B',100,'2014-01-05'UNION ALLselect 'B',300,'2014-03-05'UNION ALLselect '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.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
參考資料:
http://bbs.csdn.net/topics/390656141
http://s.yanghao.org/program/viewdetail.php?i=347818
新聞熱點
疑難解答