Вернуть 0 всего, используя группировку - PullRequest
0 голосов
/ 11 января 2019

Приведенный ниже запрос отлично работает при наличии строк. Вывести как:

   Duplicates,2
   Syntax,5
   Total,7          

Однако мне нужно вернуть строку Total, 0, если строк нет.

Попытался изменить ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, но затем он возвращает две строки. Итого, 0 Итого, 0

Возможно, я мог бы поработать с этим и убрать лишний в моем VB-коде, но хотел бы выяснить, как это сделать в SQL.

    SELECT
       nvl(to_char(dbms_lob.substr(message, 50, 1 )),'Total') AS TYPE ,
       Count(dbms_lob.substr( message, 50, 1 )) AS "HOWMANY"
   FROM applicationlogentries ALE
   INNER JOIN (
            SELECT REFERENCE_ID , Max(entry_date) AS MaxDateTime
            FROM APPLICATIONLOGENTRIES
            where Trunc(entry_date) = Trunc(SYSDATE) -8
            GROUP BY  REFERENCE_ID) groupedAle
            ON ale.reference_id = groupedAle.reference_id
            AND ale.last_updated = groupedAle.MaxDateTime
            AND ale.reference_id IN
                   (SELECT ID FROM documentsin
                    where Trunc(date_received) = Trunc(SYSDATE) -8 AND 
          status = 3)
       group by grouping sets((),(dbms_lob.substr( message, 50, 1 )))

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вам необходимо выполнить левое внешнее объединение ваших данных, чтобы получить счетчик нуля для возврата. Я нашел эту страницу, которая помогла мне понять, как это проверить. Я создал пару фиктивных таблиц. Похоже, вы должны иметь записи в одной из ваших объединенных таблиц, если ожидаете, что счетчик (*) даст вам нулевое значение.

Как включить "ноль" / "0" в агрегат COUNT?

"Причина, по которой это работает, заключается в том, что внешнее (левое) соединение вернуть NULL для тех, у кого нет записи. агрегатная функция count () не будет считать значения NULL и, таким образом, вы будете получить ноль. "

 Select a.colA, count(b.ColA)

from [dbo].[SRJTestTable1] as a
Join [dbo].[SRJTestTable2] as b
ON a.ColA =  b.ColA
Group by a.ColA

Предполагая, что в таблице 1 есть записи, а в таблице 2 - нет, и вы хотите посчитать значения из таблицы 2, вы ничего не получите при внутреннем соединении. Если вы перейдете на внешнее левое соединение, результатом будет ноль.

Я выполнил это с внешним соединением и без него, и я получил счетчик нуля, чтобы вернуться с внешним соединением.

Не удалось заставить мое изображение появляться в строке. Вот быстрая ссылка на него.

https://imgur.com/4uzkoA6

0 голосов
/ 11 января 2019

Это слишком долго для комментария.

Если вы запустите:

select count(*)
from t;

Тогда вы всегда получите одну строку, даже если t пусто. Это определение агрегации по всей таблице.

Если вы запустите:

select count(*)
from t
group by <whatever>

Тогда вы получите один ряд на группу. Если нет групп (т.е. нет данных в таблице), вы не получите строк.

Я не могу придумать, как вернуть строку - в данном случае - в пустую таблицу, используя group by.

По-видимому,

group by grouping sets ( () )

ведет себя как второй случай, а не первый. В нем говорится "есть group by, поэтому по одной строке на группу" и"нет данных, поэтому нет групп".

Единственное решение, которое я могу легко придумать, - это решение методом грубой силы: union all для суммы, которую вы хотите вычислить.

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