2011-08-09 5 views
1

CSVファイルから解析された料金とクレジットのテーブルに基づいて、料金とクレジットのレポートを作成しようとしています。このレポートのIグループに料金やクレジットを作成して、私が持っているアイテムコードに基づいて、それらを合計するにはヌル値をゼロで置き換え/空のテーブルにダミー値を入れてアクセスする

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

以下のように充電表とクレジットテーブルは、一方のフィールドのみが異なるもので、基本的には同じに見えます。例えば、私はそれがすべての課金ヶ月間の補助的な費用を合計作業している1つのクエリは、すべての罰金とダンディですが、商品コードが見つからない場合、問題が発生

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

だろう。これらのクエリは、1ヶ月間請求されない可能性があり、別の月に請求される可能性があるため、特定の請求またはクレジットの有無にかかわらず要約を表示できるように、これらのクエリの柔軟性が必要です。我々は、彼らが合算することはできません、それらの特定のアイテムコードのために入金されていない、結果セットが空のテーブルですので

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; 

動作しない問題のクエリは、この一つです。そのような状況が発生した場合、SumOfCreditの請求期間と返品期間を返す方法はありますか?私はNz()関数とIIf(IsNull())を試しましたが、それは私を助けませんでした。

ご協力いただければ幸いです。

EDIT:それはこのようになりますように、私は、クエリを変更:

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)); 

これは動作しますが、それはすべての請求期間は表示されません。たとえば、1つの特定の商品コードに2011年1月1日と2011年2月1日の請求があった場合、その2つのレコードのみが表示されます。私はそれがテーブルのすべての適用可能な請求期間を示すことを望みます。その月の料金が課金されているところでは料金がありません。私はクエリの最後に3番目のUNIONを追加しようとしましたが、もう一度BillingPeriodを選択しましたが、1ヶ月間重複したレコードが追加されてしまいました。再び、どんな助けも素晴らしいだろう。

+0

'BillingPeriod' 、 お願いします。この列のデータ例も良いでしょう。 –

答えて

1

まず、以下のマントラでは、一つにあなたの不器用なORのを減らす「以下のコードはいいです」:

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やその他の1行の結果セットから選択しない場合(例:FROM SYSTABLES WHERE ID = 1など)

+0

私はクエリーをSELECT BillingPeriod、0 FROM Creditsに変更しました。どうもありがとうございました!私はあなたにアップアップしますが、私は評判がありません。 – Tom

+0

もう1つは、申し訳ありませんが、たとえば、あなたが1つの請求期間の有効なレコードがある場合は、あなたがそれを書いたときに、私の変更とともに、クエリを持っている場合、結果セットはその請求期間になります。私はそれが請求期間のすべてであることを希望し、その月に請求されなかった場合、合計は0になります。 – Tom

+0

あなたは必要な余分な行ごとに余分な共用体を追加する必要があります – Bohemian

関連する問題