2012-11-06 50 views
2

我对此很新,所以原谅如果这已被张贴(我不知道甚至搜索什么)。使用总和()与多个where子句

我有2个表,会计和用法

AccountID AccountStartDate AccountEndDate 
------------------------------------------- 
1   12/1/2012   12/1/2013 
2   1/1/2013   1/1/2014 


UsageId AccountID EstimatedUsage StartDate EndDate 
------------------------------------------------------ 
1   1   10    1/1  1/31 
2   1   11    2/1  2/29 
3   1   23    3/1  3/31 
4   1   23    4/1  4/30 
5   1   15    5/1  5/31 
6   1   20    6/1  6/30 
7   1   15    7/1  7/31 
8   1   12    8/1  8/31 
9   1   14    9/1  9/30 
10  1   21    10/1  10/31 
11  1   27    11/1  11/30 
12  1   34    12/1  12/31 
13  2   13    1/1  1/31 
14  2   13    2/1  2/29 
15  2   28    3/1  3/31 
16  2   29    4/1  4/30 
17  2   31    5/1  5/31 
18  2   26    6/1  6/30 
19  2   43    7/1  7/31 
20  2   32    8/1  8/31 
21  2   18    9/1  9/30 
22  2   20    10/1  10/31 
23  2   47    11/1  11/30 
24  2   33    12/1  12/31 

我想编写一个查询,让我估计使用情况每月(从现在开始,直到上个月我们所服务的帐户)的所有帐户在该月份提供服务。

结果将如下所示:

Month-Year  Total Est Usage 
------------------------------ 
Oct-12   0 (none being served) 
Nov-12   0 (none being served) 
Dec-12   34 (only accountid 1 being served) 
Jan-13   23 (accountid 1 & 2 being served) 
Feb-13   24 (accountid 1 & 2 being served) 
Mar-13   51 (accountid 1 & 2 being served) 
... 
Dec-13   33 (only accountid 2 being served) 
Jan-14   0 (none being served) 
Feb-14   0 (none being served) 

我假设我需要总结,然后做一组,...但真的不知道我怎么逻辑奠定想这一点。

+0

使用日期应该有几年? – Laurence

回答

3

修订答:

我创建了一个月表列MonthID,月与价值观一样(201212,12),(201301,1),... 我还重组了使用表有一个月的专栏,而不是开始日期和结束日期,因为它使思路更清晰。

http://sqlfiddle.com/#!3/f57d84/6的细节

现在的查询是:

Select 
    m.MonthID, 
    Sum(u.EstimatedUsage) TotalEstimatedUsage 
From 
    Accounts a 
    Inner Join 
    Usage u 
    On a.AccountID = u.AccountID 
    Inner Join 
    Months m 
    On m.MonthID Between 
     Year(a.AccountStartDate) * 100 + Month(a.AccountStartDate) And 
     Year(a.AccountEndDate) * 100 + Month(a.AccountEndDate) And 
     m.Month = u.Month 
Group By 
    m.MonthID 
Order By 
    1 

以前的答案,以供参考当做惯例范围为全日期,而不是几个月。

Select 
    Year(u.StartDate), 
    Month(u.StartDate), 
    Sum(Case When a.AccountStartDate <= u.StartDate And a.AccountEndDate >= u.EndDate Then u.EstimatedUsage Else 0 End) TotalEstimatedUsage 
From 
    Accounts a 
    Inner Join 
    Usage u 
    On a.AccountID = u.AccountID 
Group By 
    Year(u.StartDate), 
    Month(u.StartDate) 
Order By 
    1, 2 
+0

我对开始/结束日期有点困惑。用量表按月估算帐户使用情况(不分年份)。所以2013年1月的使用量与2014年1月的使用量相同。所以我需要从当前直到最后一个合同结束时返回所有月份,这将比使用表中的月份数多。 – JeffO

+0

@JeffO我已更新以展示您对待您的要求的方式。您通常会以编程方式生成月表。如果需要,您可以使用CTE在飞行中生成它。如果你想支持任何开始日期/结束日期而不是整个月,你需要一个类似的日子表。如果您的帐户范围没有重叠,您还需要进行一些调查以确保答案的连续月份范围。 – Laurence