Проверка и отображение нулевого значения в MS Access Query

Я пытаюсь написать SQL-запрос, чтобы показать сумму каждой категории. Проблема в том, что мне нужна сумма каждой категории, и даже если сумма равна нулю, она все равно должна отображать результаты.

Я делаю это с помощью уровня DAL, поэтому через C# и использую базу данных Access 2010.

Это мой текущий рабочий запрос:

SELECT        SUM(f.bedrag) AS totaal, c.omschrijving, Limiet.maximumBedrag
FROM            ((Financien f INNER JOIN
                         Categorie c ON f.categorieId = c.id) INNER JOIN
                         Limiet ON f.limietId = Limiet.id)
WHERE        (f.inkomstOfUitgave = 1)
GROUP BY f.categorieId, c.omschrijving, Limiet.maximumBedrag

Теперь в дополнение к функции SUM мне также нужно проверить наличие нулей, и если сумма категории равна 0, она должна отображать 0. Все результаты, которые равны 0, теперь отфильтровываются, но я ДОЛЖЕН их видеть.

Кто-нибудь знает, как это исправить? Я пробовал IsNull() и NZ, но у меня не получилось. Вот скриншот результата запроса.

Как вы можете видеть, я получаю два результата, но я должен получить 7, если запрос будет отображать сумму 0 результатов.

Кто-нибудь знает, как это исправить?


person Yenthe    schedule 13.04.2013    source источник


Ответы (2)


Если возникает вопрос о том, как отобразить Null как 0 в запросе Access, рассмотрите этот простой запрос. Он возвращает несколько строк с Null в столбце SumOfbedrag.

SELECT y.categorieId, Sum(y.bedrag) AS SumOfbedrag
FROM YourTable AS y
GROUP BY y.categorieId

Используя этот SQL в качестве подзапроса, содержащий запрос может преобразовать Null в 0 с помощью выражения IIf().

SELECT
    sub.categorieId,
    IIf(sub.SumOfbedrag Is Null, 0, sub.SumOfbedrag) AS totaal
FROM
    (
        SELECT y.categorieId, Sum(y.bedrag) AS SumOfbedrag
        FROM YourTable AS y
        GROUP BY y.categorieId
    ) AS sub;

Однако, глядя на ваш снимок экрана снова, я думаю, что проблема на самом деле в том, что ваш запрос не включает строки с Null в столбце totaal. В этом случае проверьте базовые данные, прежде чем агрегировать их с помощью GROUP BY. Посмотрите, возвращает ли этот запрос какие-либо строки...

SELECT f.bedrag, c.omschrijving, Limiet.maximumBedrag
FROM
    (Financien f
    INNER JOIN Categorie c
    ON f.categorieId = c.id)
    INNER JOIN Limiet
    ON f.limietId = Limiet.id
WHERE
        f.inkomstOfUitgave = 1
    AND f.bedrag Is Null

Если этот запрос не возвращает строк, я думаю, что одно или оба ваших объединения должны быть изменены с INNER на LEFT JOIN или RIGHT JOIN.

person HansUp    schedule 13.04.2013
comment
Да, я тоже думал о LEFT/RIGHT JOIN. - person Gord Thompson; 13.04.2013
comment
Во-первых, подзапрос не работает, так как IS не поддерживается программой :( Во-вторых, если я выполню ваш последний запрос, я действительно НИЧЕГО не получу в результате! Поэтому я считаю, что мне понадобится левое или правое соединение тогда? На этом изображении вы можете увидеть мою структуру базы данных для трех таблиц, которые я использую, не могли бы вы сказать мне, как закодировать соединение? Я продолжаю получать ошибки: / И да, на самом деле все, что дает 0 в виде суммы, должно быть отображается :) Мне нужны другие данные для чего-то другого! Структура таблицы в Access: i.imgur.com/MWs4hm8.png - person Yenthe; 13.04.2013
comment
Во-первых, подзапрос не работает, так как IS не поддерживается программой Я создал таблицу, затем создал и протестировал этот запрос в Access 2007, а затем скопировал текст SQL и вставил это в ответ. Это действительно Access SQL - person HansUp; 13.04.2013
comment
Да, но дело в том, что я делаю запросы на C # через уровень DAL ... и это не тот же SQL, что и Access SQL, поэтому кажется: / Так что мне не разрешено использовать IS - person Yenthe; 13.04.2013
comment
Любая другая идея о том, как исправить этот HansUp? Я довольно застрял здесь :/ - person Yenthe; 14.04.2013
comment
Из того, что вы нам сказали, кажется, что DAL отклоняет или искажает действительный SQL Access. Так что не вижу, чем могу помочь. Вам нужна помощь того, кто знает DAL. - person HansUp; 14.04.2013

Ответом на то, что также показаны значения 0, был: Ответ был сделан "drch", и я ему очень благодарен за это! :)

SUM(IIF(IsNULL(f.bedrag), 0, f.bedrag)) AS bedrag

Там, где много других вещей тоже не так, это полный запрос:

SELECT        c.omschrijving as Omschrijving, SUM(IIF(IsNULL(f.bedrag), 0, f.bedrag)) AS bedrag, l.maximumBedrag as maximumBedrag
FROM            ((Categorie c LEFT OUTER JOIN
                         Financien f ON f.categorieId = c.id) LEFT OUTER JOIN
                         Limiet l ON l.categorieId = c.id)
WHERE        (f.inkomstOfUitgave IS NULL) OR
                         (f.inkomstOfUitgave = 1)
GROUP BY c.id, f.categorieId, c.omschrijving, l.maximumBedrag
person Yenthe    schedule 14.04.2013