2011-06-25 25 views
0

我已經試過這條SQL語句的許多變化對本網站大量的研究以及其他人後,但我失去了一些東西SQL |具有多個分組和標準累計成本

我的數據表如下所示:

.....Date.....Boolean...Group....Imp......Cost 
....1/1/11.....TRUE.........A........High.......$100 
....1/1/11.....FALSE........A........Med........$150 
....1/1/11.....TRUE.........B........High.......$200 
....2/1/11.....TRUE.........B........Low........$300 

對於每個月,我想要按「組」和「進出口」進行分組的累計成本。這裏是我的SQL查詢現在,但累積和(在我的更大的數據集)WAAAYYY關閉。

SELECT t1.Date, 
     t1.Group, 
     t1.Imp, 
     Sum(t2.Cost) AS RunTotal 
FROM datatable t1 
INNER JOIN datatable t2 ON t1.Date >= t2.Date 
WHERE t1.Boolean=TRUE 
GROUP BY t1.Date, 
     t1.Group, 
     t1.Imp 

請注意,我無法使用交叉連接,因爲我使用的是MS Access。任何想法的錯誤是?

+1

什麼是「WAAAYYY關」。意思? –

+0

累計總數比應該多10x-100x(大約)。我試圖找到一個共同的因素來幫助調試,但一直無法計算。 – carlyman

+0

這是因爲t1.Date> = t2.Date的連接條件,它具有受限制的CROSS JOIN的作用... –

回答

0

您是否嘗試過不使用Join?這是我使用的查詢,它似乎正常工作。

SELECT [Date], [Group], Img, SUM(Cost) AS RunTotal 
FROM datatable WHERE [Boolean] = True 
GROUP BY [Date], [Group], Img 
+0

這不提供一個運行總數(至少當我嘗試了)。每個月只包括前幾個月的總和。 – carlyman

0

如果你希望你的運行總數爲每組和每個小鬼,你需要包括在你的加入,以及:現在

Select t1.Date, t1.Group, t1.Imp, Sum(t2.Cost) as RunTotal 
From datatable t1 
Inner Join datatable t2 on t1.Group = t2.Group and t1.Imp = t2.Imp and t1.Date >= t2.Date 
WHERE t1.Boolean=TRUE 
GROUP BY t1.Date, t1.Group, t1.Imp 

,您正在使用的所有記錄,其中T1加盟.Date> = t2.Date,以便包含不匹配組/ imp的記錄。只需運行以下內容:

Select t1.Date, t1.Group, t1.Imp, t2.Date, t2.Group, t2.Imp, t2.Cost 
From datatable t1 
Inner Join datatable t2 on t1.Date >= t2.Date 
WHERE t1.Boolean=TRUE 

您應該看到您不想要的t2.Cost記錄。