2011-08-09 87 views
1

我试图根据从CSV文件解析的费用和积分表创建费用和积分的报告。计费表和信用表看起来基本上是相同的,只有一个领域是不同的,如下图所示用零替换空值/将虚拟值替换为空表在Access中

BillingPeriod | ItemCode | ItemName | Charge(Credit) | IsAdjustment | AdjustmentDate | ReportTimestamp 

为了创建这个报告我组的费用和信用额度,并根据我的项目代码总结他们。例如,一个查询我有工作,总结了所有的帐单月份附加费用将

SELECT Charges.BillingPeriod, Sum(Charges.Charge) as SumOfCharge 
FROM Charges 
WHERE (Charges.ItemCode Between 1301 and 1380) 
GROUP BY Charges.BillingPeriod; 

这是所有罚款和花花公子,但如果找不到物品代码问题就出现了。我希望这些查询具有足够的灵活性,以便能够显示包含或不包含特定费用/信用的摘要,因为您可能不会在一个月内收取费用,并且可能会在另一个月内收取费用。

问题不起作用的查询是这样的一个:

SELECT Credits.BillingPeriod, Sum(Credits.Credit) AS SumOfCredit 
FROM Credits 
WHERE (((Credits.ItemCode)=2217 Or (Credits.ItemCode)=2218 Or (Credits.ItemCode)=2241 Or (Credits.ItemCode)=2245 Or (Credits.ItemCode)=2260)) 
GROUP BY Credits.BillingPeriod; 

因为我们没有被计入这些特殊项目的代码,它们不能相加,结果集是一个空表。如果出现这种情况,有没有办法可以返回一个空的结算期和一个0的SumOfCredit?我尝试了Nz()函数,以及IIf(IsNull()),但这并没有帮助我。

任何帮助,将不胜感激。

编辑:我改变了查询,以便它看起来像这样:

SELECT Charges.BillingPeriod, SUM(Charges.Charge) AS SumOfCharge 
FROM Charges 
WHERE (((Charges.ItemCode) Between 1900 And 1995)) 
GROUP BY Charges.BillingPeriod 
UNION 
SELECT BillingPeriod, 0 
FROM Charges 
WHERE NOT EXISTS (SELECT * FROM Charges WHERE (Charges.ItemCode Between 1900 And 1995)); 

这工作,但它并没有显示所有的计费时段。例如,如果某个特定商品代码的收费时间为2011年1月1日和2011年2月1日,则只会显示这两条记录。我希望它能够在表格中显示每个可应用的结算周期。有月费的地方收费,没有收费的地方收费。我尝试在查询的末尾添加第三个UNION,再次选择BillingPeriod,但它为一个月添加了一个重复记录,这是我不想要的。再次,任何帮助将是真棒。

+0

什么是'BillingPeriod' , 请。这个列的示例数据也是很好的。 –

回答

1

首先,继“更少的代码是好的”的口号,减少你的笨拙或年代进入一个IN:

WHERE Credits.ItemCode in (2217, 2218, 2241, 2245, 2260) 

接下来,所有不存在ItemCodes的表格工会:

SELECT Credits.BillingPeriod, Sum(Credits.Credit) AS SumOfCredit 
FROM Credits 
WHERE Credits.ItemCode in (2217, 2218, 2241, 2245, 2260) 
GROUP BY Credits.BillingPeriod 
UNION 
SELECT null, 0 
WHERE NOT EXISTS (SELECT * FROM Credits 
    WHERE Credits.ItemCode in (2217, 2218, 2241, 2245, 2260)); 

我不这样做,如果Access不允许FROM子句 - 如果它不从DUAL或其他一行结果集中选择(例如FROM SYSTABLES WHERE ID = 1或其他)

+0

我将查询更改为SELECT BillingPeriod,0 FROM Credits,并且按照我想要的方式工作。非常感谢你!我喜欢你,但我没有声望哈哈。 – Tom

+0

还有一件事,对不起,但是当我写下你的查询时,以及我的修改,例如,如果在一个结算周期内有一个有效的记录,那么结果集将只是该结算周期。我希望它是所有的结算周期,如果我们没有为该月结算,那么总和为0.任何想法如何修改这个查询,使它做到这一点? – Tom

+0

您必须为每个想要的额外行添加额外的联合 – Bohemian