select count(distinct consumerno),
sum (case when ccon like '%D%' then 1 else 0 end) as Domestic,
sum (case when ccon like '%B%' then 1 else 0 end) as Business
from consumer left join contract on consumerno = cconsumer
where status = 'Active'
Вывод
total B D
35952 35694 1669
Есть две таблицы: потребительская и контрактная.
Здесь я пытаюсь получить общее количество потребителей, которые покупают продукт, начиная с бизнеса или дома. Таблица контрактов имеет повторяющиеся номера потребителей, поскольку они меняются от служебного к домашнему или наоборот. Как видно из приведенного выше запроса, сумма запросов верна, но сумма для домашнего и коммерческого использования неверна. Любой лучший способ добиться этого.
Любые комментарии будут оценены
Я предполагаю, что поле «статус» находится в таблице «контракт». Самый простой способ - создать 3 отдельных запроса, которые, как вы уверены, отражают правильное число для каждой суммы, и избегать объединений там, где они не нужны.
SELECT COUNT(DISTINCT consumerno) as TOTAL FROM consumer LEFT JOIN contract ON consumerno = cconsumer WHERE status='Active';
SELECT COUNT (DISTINCT cconsumer) as B FROM contract WHERE ccon LIKE '%B%' AND status='Active';
SELECT COUNT (DISTINCT cconsumer) as D FROM contract WHERE ccon LIKE '%D%' AND status='Active';
Вы можете создать объединение в поле заполнителя, чтобы при необходимости поместить их все в одну аккуратную строку.