我通常使用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。感谢您提前提供任何帮助或提示 - 非常感谢!
答案 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