aijiao

先谈谈需求,我们先创建一张表,脚本如下:

复制代码
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是否支持

分类:

技术点:

相关文章:

  • 2019-07-01
  • 2021-09-05
  • 2021-12-27
  • 2021-12-09
  • 2022-12-23
  • 2021-07-27
  • 2022-12-23
  • 2022-02-02
猜你喜欢
  • 2022-12-23
  • 2021-10-09
  • 2021-09-18
  • 2022-12-23
  • 2021-11-12
  • 2021-05-28
相关资源
相似解决方案