Замените нулевые значения на нули / Поместите фиктивные значения в пустую таблицу в Access - PullRequest
1 голос
/ 09 августа 2011

Я пытаюсь создать отчет о расходах и кредитах на основе таблицы сборов и кредитов, которые анализируются из файла CSV. Таблица начислений и таблица начисления кредитов выглядят в основном одинаково, отличается только одно поле, как показано ниже

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

Это работает, но не отображает ВСЕ биллинговые периоды. Например, если за один конкретный код товара взимается плата за 01.01.2011 и 1.02.2011, он отобразит ТОЛЬКО эти две записи. Я хочу, чтобы в таблице указывался каждый применимый расчетный период. Сборы, где есть плата за месяц, и нули, где нет. Я попытался добавить третий UNION в конец запроса, снова выбрав BillingPeriod, 0, но он добавляет дубликат записи на месяц, что мне не нужно. Опять же, любая помощь будет потрясающей.

1 Ответ

1 голос
/ 09 августа 2011

Во-первых, следуя мантре «меньше кода - это хорошо», уменьшите ваши неуклюжие ИЛИ до одного 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 - если он не выбирает из ДВОЙНОГО или какого-либо другого однострочного набора результатов (например, FROM SYSTABLES WHERE ID = 1 или что-либо еще)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...