SqlServer使用表值函數匯總
先談談需求,我們先創建一張表,腳本如下:
create table Cost
(
Id int identity(1,1) primary key,--編號
CostTime date,--時間
Num int--銷售額
);
insert into Cost(CostTime,Num) values('2016-09-01','50');
insert into Cost(CostTime,Num) values('2016-09-01','100');
insert into Cost(CostTime,Num) values('2016-09-03','200');
insert into Cost(CostTime,Num) values('2016-09-05','2');
如果我們要統計上面的這張表在每天的銷售額,可以按照CostTime分組,然后用sum(Num)進行統計,sql如下:
select CostTime,sum(Num) Num from Cost where CostTime>='2016-09-01' and CostTime<='2016-09-05' group by CostTime;
執行結果如下:

很明顯只有3天的數據,如果我們想要把2號和4號的數據也顯示出來呢,期望結果如下:

====================================================================================
很明顯要實現上面的需求我們首先考慮的是創建一張臨時表來存放2016-09-01到2016-09-05這個區間的數據,然后通過匯總關聯查詢即可,可是如果創建臨時表對系統的開銷還是比較大的,有沒有什么方法可以不用創建表而實現該需求呢,答案是:表值函數
我們首先創建表值函數如下:
CREATE FUNCTION [dbo].[GetTimeCol]
(
@beginTime date,
@endTime date
)
RETURNS @returntable TABLE
(
CostTime date
)
AS
BEGIN
while(@beginTime<=@endTime)
begin
insert into @returntable select @beginTime
select @beginTime=dateadd(day,1,@beginTime)
end;
RETURN
END
然后執行最終sql語句如下:
select a.CostTime,isnull(b.Num,0) Num from GetTimeCol('2016-09-01','2016-09-05') a left join
(select CostTime,sum(Num) Num from Cost where CostTime>='2016-09-01' and CostTime<='2016-09-05' group by CostTime) b
on a.CostTime=b.CostTime
OK,就得到我們希望的結果了
:SqlServer對表值函數支持挺好,但是不知道Oracle、MySql是否支持

