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

相关文章
相关标签/搜索