SqlServer使用表值函數彙總

SqlServer使用表值函數彙總

 

先談談需求,咱們先建立一張表,腳本以下:html

複製代碼
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以下:sql

select CostTime,sum(Num) Num from Cost where CostTime>='2016-09-01' and CostTime<='2016-09-05' group by CostTime;

執行結果以下:ide

很明顯只有3天的數據,若是咱們想要把2號和4號的數據也顯示出來呢,指望結果以下:函數

====================================================================================post

很明顯要實現上面的需求咱們首先考慮的是建立一張臨時表來存放2016-09-01到2016-09-05這個區間的數據,而後經過彙總關聯查詢便可,但是若是建立臨時表對系統的開銷仍是比較大的,有沒有什麼方法能夠不用建立表而實現該需求呢,答案是:表值函數url

咱們首先建立表值函數以下:spa

複製代碼
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語句以下:code

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,就獲得咱們但願的結果了htm

:SqlServer對錶值函數支持挺好,可是不知道Oracle、MySql是否支持blog

相關文章
相關標籤/搜索