Недавно мне пришлось столкнуться с sql-запросами, хотя это не моя специальность. Я использую следующий запрос: моя проблема в том, что если строка имеет count (1) = 0, она не отображается. Первый запрос - это эволюция второго, которая, очевидно, отображает строку, если значение равно 0. Эволюция была необходима из-за большого количества кодов агентств, чтобы сделать все быстрее и не выполнять n запросов для n кодов агентств.
SELECT
rollout.id AS 'RowNumber',
rollout.AgencyCode,
COUNT(1) AS 'NumberOfTitleAgnecy',
SUM(COUNT(1)) OVER() AS 'SumOfTitle'
FROM STAGINGTITLE AS ST
INNER JOIN (
VALUES
(1,'000001'),
(2,'000002'),
(3,'000003')
) AS rollout (id, CodAgency)
ON ST.AgencyCode = rollout.CodAgency
WHERE ST.ExternalId IS NULL
AND ST.TitleState = 'BackWard'
GROUP BY rollout.id, rollout.CodAgency
ORDER BY rollout.id
SELECT COUNT(1)
FROM STAGINGTITLE AS ST
WHERE ST.AgencyCode = '000001'
AND ST.ExternalId IS NULL
AND ST.TitleState = 'BackWard'
У вас есть предложение, как изменить первый запрос, чтобы отображалось количество строк (1) = 0?
Обновлено: ожидаемый результат
RowNumber | AgencyCode | NumberOfTitleAgnecy | SumOfTitle |
-----------------------------------------------------------
1 | 000001 | 100 | 300 |
2 | 000002 | 0 | 300 |
3 | 000003 | 150 | 300 |
4 | 000004 | 50 | 300 |
Если бы вы внимательно прочитали вопрос, вы бы заметили, что он относится к первому запросу, а второй - только для лучшего объяснения.
Будет ли работать, если вы измените INNER на RIGHT join? Помните, что подсчет ведется после WHERE.
Можете ли вы описать, какой конкретный результат / поведение вы хотите от этого? И откажитесь от этого соединения и вместо этого используйте предложение case или приведение как целое число в операторе select. Это внутреннее соединение, вероятно, удаляет ожидаемые вами строки.
@dodexahedron Конечно: прочтите правку
Используйте LEFT JOIN
:
SELECT rollout.id AS RowNumber,
rollout.CodAgency,
COUNT(st.AgencyCode) AS NumberOfTitleAgnecy,
SUM(COUNT(st.AgencyCode)) OVER () AS SumOfTitle
FROM (VALUES (1, '000001'), (2, '000002'), (3, '000003')
) rollout(id, CodAgency) LEFT JOIN
STAGINGTITLE ST
ON ST.AgencyCode = rollout.CodAgency AND
ST.ExternalId IS NULL AND ST.TitleState = 'BackWard'
GROUP BY rollout.id, rollout.CodAgency
ORDER BY rollout.id;
Примечания:
WHERE
перемещен в пункт ON
, поэтому LEFT JOIN
не превращается в INNER JOIN
.COUNT()
теперь считает количество совпадений, поэтому он может вернуть 0
.ST
исправлен.CodAgency
исправлена.Спасибо за вашу помощь
Пожалуйста, отметьте только ту базу данных, которую вы действительно используете. Вы также говорите «следующий запрос», а затем получаете два запроса.