Как мне вернуть нулевое значение инструкции Case в Group by

#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