#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
столбец Elites.HasInsurance
равен :
HasInsurance
true
true
true
Я сгруппирую этот столбец с помощью этой команды :
Select CASE WHEN e.HasInsurance=1 THEN N'YES' ELSE N'NO' END AS HasInsurance, COUNT(*) as CountHasInsurance
from
Elites e
group by e.HasInsurance
И полученный результат равен:
YES ==> 3
Но я хочу получить следующий вывод :
YES ==> 3
NO ==> 0
Я не хочу создавать новую таблицу в базе данных.
Ответ №1:
Вам нужен LEFT JOIN
. Я бы рекомендовал:
select v.hasInsuranceStr, count(e.hasInsurance) as CountHasInsurance
from (values (N'Yes', 'true'), (N'No', 'false')
) v(hasInsuranceStr, hasInsurance) left join
Elites e
on e.hasInsurance = v.hasInsurance
group by v.hasInsuranceStr;
Некоторые примечания:
- При этом не используется имя
hasInsurance
для первого столбца. Это уже целочисленное значение. Я рекомендую другое имя. VALUES()
содержит как число, так и значение поиска.- Предположительно
true
представляет собой строку, поскольку SQL Server не поддерживает логические типы.
Комментарии:
1. «поскольку SQL Server не поддерживает логические типы» Неверно.
bit
Может легко использоваться как логическое значение и поддерживает значения'true'
/'false'
:SELECT CONVERT(bit, 'true'), CONVERT(bit,'false');
возвращает1
и0
соответственно. db<>fiddle ( Интересно, что DB Fiddle на самом деле отображаетTrue
/False
, поэтому я также используюbit
значения для демонстрации )2. @Gordon , после написания
where
команды передgroup by
командой нулевая группа удаляется.Where ==> e.IsEnable = 1
3. @Larnu . . .
true
иfalse
(без кавычек) недопустимые значения в SQL Server. Например: dbfiddle.uk /… .4. @Larnu
'true'
и'false'
— это строки, которые неявно преобразуются в бит в определенных контекстах . Это далеко от полностью поддерживаемых официальных логических типов.5. Не могли бы вы просто предположить, что это разница в диалекте, хотя @AaronBertrand ? Если только вы не предполагаете, что логическое значение имеет другие функциональные возможности, которых нет у
bit
a; если да, то чего не хватает? Я бы не стал утверждать, что только необходимость заключать в кавычкиtrue
/false
считается «не поддерживается» при работе сbit
; было бы все равно, что указать, что конкатенация строк не поддерживается в T-SQL, потому что он используетоператор вместо
|
(если это ваша единственная причина для указания, что это не поддерживается). Если вы предполагаете, чтоbit
также нельзя использовать для логического значения, что, по вашему мнению, должно быть?
Ответ №2:
Это должно дать вам то, что вам нужно:
SELECT TF.[value] AS HasInsurance,
COUNT(E.HasInsurance) AS [Count]
FROM (VALUES('True'),('False')) TF([Value])
LEFT JOIN Elites E ON TF.[value] = E.HasInsurance
GROUP BY TF.[value];
Запрос не вернет строки для данных, которые не существуют; поэтому VALUES
предложение создает строки для обоих 'True'
и 'False'
, что означает, что значения могут быть возвращены, даже если их нет в Elites
таблице.
Ответ №3:
Вы могли бы использовать:
Select
CASE WHEN e.HasInsurance=1 THEN N'YES' ELSE N'NO' END AS HasInsurance,
COUNT(e.HasInsurance) as CountHasInsurance
FROM (SELECT 0 UNION SELECT 1) AS s(x)
LEFT JOIN Elites e
ON s.x = e.HasInsurance
group by s.x