2011-10-10 164 views
1

我通常使用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 

我要創建一個報告有人能列出所有銷售爲一體的載時段(說他們挑「08」上傳上午4:00和7之間的所有銷售:59am。這部分很簡單,但我還需要添加之前的4小時和8小時之間的差異。

例如(並且只從上面查看產品「ABC」):在報告中有人呼籲提供2011-09-10午夜('04')報告的報告,該報告將於上午4點在凌晨12:00至03點之間上傳:59am:

**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」或更早上午08:00下午到上午11:59的時間段。

我知道我可以在應用服務器端(本例中爲ColdFusion)使用邏輯來處理00以下(日期改變-1)的小時列。我認爲我需要的是每個「差異」字段的子查詢,其中每個子查詢將查找前一時間段的銷售額並將其除以主選擇的銷售額。

我理解子查詢的概念,但我從來沒有寫過一個(如果這就是我應該嘗試在這裏做的)。另外,我以前從來沒有使用過MS Sequel。感謝您的任何幫助或提示 - 非常感謝!

回答

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 @[email protected] 
set @[email protected] 
if @hour1<0 
    begin 
     set @hour1=12 
     set @date1=DATEADD(dd,-1,@date0) 
    end 

set @[email protected] 
set @[email protected] 
if @hour2<0 
    begin 
     set @hour2=12 
     set @date2=DATEADD(dd,-1,@date1) 
    end 

set @[email protected] 
set @[email protected] 
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][email protected] AND [Hour][email protected]) t1 on t0.Item=t1.Item and t0.Color=t1.Color 
    LEFT JOIN (select Item, Color, Sales from #tblSales where [Date][email protected] AND [Hour][email protected]) t2 on t0.Item=t2.Item and t0.Color=t2.Color 
    LEFT JOIN (select Item, Color, Sales from #tblSales where [Date][email protected] AND [Hour][email protected]) t3 on t0.Item=t3.Item and t0.Color=t3.Color 
where t0.[Date][email protected] 
     AND t0.[Hour][email protected] 


drop table #tblSales 
+0

謝謝,這幫助了很多。 – Reno

+0

不客氣。 –

相關問題