2011-06-25 21 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记录。