查询以列出特定时间段的销售额和以前时间段的销售额差异

时间:2011-10-10 02:56:26

标签: sql-server

我通常使用MySQL数据库构建Web工具,而我的SQL技能并不高级。我已经被投入建立一份报告,这是我的头脑。

我有一张桌子,每隔4个小时,一份工作会插入前4个小时的每件产品的销售数量。此表的一列变为日期,另一列变为两位数字,表示小时(从午夜开始,4小时间隔为: 00,04,08,12,16,20)。

表格如下:

Item Color  Size    Hour    Date           Sales
ABC Yellow  S       00      2011-09-10      432
DEF Red     M       00      2011-09-10      1324
GHI Blue    L       00      2011-09-10      567
JKL Tan     XL      00      2011-09-10      967
MNO Green   S       00      2011-09-10      457
ABC Yellow  L       04      2011-09-10      852

我必须创建一个报告,其中某人可以列出上传期间的所有销售(比如他们在凌晨4:00到早上7:59之间为所有销售选择'08'上传。这部分很简单,但我还需要添加在之前的4,8和12小时之间的百分比差异。

例如(并且只查看上面的产品'ABC'):在报告页面上,有人要求提供2011-09-10报告的午夜('04')报告,该报告将是4上传的报告:上午12:00至凌晨03:59之间的销售时间为00:

**8:00pm - 11:59am Report**
Item  Color   Size  Date        Sales   4_hour_diff  8_hour_diff 12_hour_diff
ABC   Yellow  S     2011-09-10  852     1.9723       ---         ---

(4小时的差异是销售额比前一个4小时高出近200% - 早上“00”或晚上8点到早上11:59。

我知道我可以在应用服务器端使用逻辑(本例中为ColdFusion)来处理00以下的小时列(日期改变为-1)。我认为我需要的是每个“diff”字段的子查询,其中每个子查询将找到前一时间段的销售额,并将其除以主要选择的销售额。

我理解子查询的概念,但我从来没有写过一个(如果那是我应该在这里尝试做的)。另外,我以前从未接受过MS Sequel。感谢您提前提供任何帮助或提示 - 非常感谢!

1 个答案:

答案 0 :(得分:0)

试试这个脚本:

use tempdb
GO

declare @date0 date, @date1 date, @date2 date, @date3 date
declare @hour0 int, @hour1 int, @hour2 int, @hour3 int

set @date0='20110910'
set @hour0=4


create table #tblSales(Item varchar(5), Color varchar(20),  Size varchar(2), [Hour] tinyint,  [Date] date, Sales int)

insert into #tblSales (Item, Color, Size, [Hour],  [Date], Sales) values ('ABC', 'Yellow',  'S',0, '20110910', 432)
insert into #tblSales (Item, Color, Size, [Hour],  [Date], Sales) values ('DEF', 'Red',     'M',0, '20110910',1324)
insert into #tblSales (Item, Color, Size, [Hour],  [Date], Sales) values ('GHI', 'Blue',    'L',0,  '20110910',567)
insert into #tblSales (Item, Color, Size, [Hour],  [Date], Sales) values ('JKL', 'Tan',     'XL',0, '20110910',967)
insert into #tblSales (Item, Color, Size, [Hour],  [Date], Sales) values ('MNO', 'Green',   'S',0,  '20110910',457)
insert into #tblSales (Item, Color, Size, [Hour],  [Date], Sales) values ('ABC', 'Yellow',  'L',4,  '20110910',852)
insert into #tblSales (Item, Color, Size, [Hour],  [Date], Sales) values ('ABC', 'Yellow',  'L',8,  '20110909',1852)

--this part can be done in WHILE
set @hour1=@hour0-4
set @date1=@date0
if @hour1<0
    begin
        set @hour1=12
        set @date1=DATEADD(dd,-1,@date0)
    end

set @hour2=@hour1-4
set @date2=@date1
if @hour2<0
    begin
        set @hour2=12
        set @date2=DATEADD(dd,-1,@date1)
    end

set @hour3=@hour2-4
set @date3=@date2
if @hour1<0
    begin
        set @hour3=12
        set @date3=DATEADD(dd,-1,@date2)
    end


select t0.Item, t0.Color, t0.Size, t0.Sales,
        cast(t0.Sales as float)/cast(t1.Sales as float)  '4-hour diff',
        cast(t0.Sales as float)/cast(t2.Sales as float)  '8-hour diff',
        cast(t0.Sales as float)/cast(t3.Sales as float)  '12-hour diff'
from #tblSales t0
     LEFT JOIN (select Item, Color, Sales from #tblSales where [Date]=@date1  AND [Hour]=@hour1) t1 on t0.Item=t1.Item and t0.Color=t1.Color
     LEFT JOIN (select Item, Color, Sales from #tblSales where [Date]=@date2  AND [Hour]=@hour2) t2 on t0.Item=t2.Item and t0.Color=t2.Color
     LEFT JOIN (select Item, Color, Sales from #tblSales where [Date]=@date3  AND [Hour]=@hour3) t3 on t0.Item=t3.Item and t0.Color=t3.Color
where t0.[Date]=@date0
      AND t0.[Hour]=@hour0


drop table #tblSales