#sql #sql-server #select #count
#sql #sql-сервер #выберите #количество
Вопрос:
Я хочу посчитать все строки, которые имеют только то значение, которое я хочу, вот так:
SELECT Users.Balance,
Users.FreeBids,
COUNT(Bids.Burned = 0) AS 'ActiveBids',
COUNT(Bids.Burned = 1) AS 'BurnedBids'
FROM Users
INNER JOIN Bids
ON Users.ID = Bids.BidderID
WHERE Users.ID = 2
GROUP BY Users.Balance,
Users.FreeBids
В нем говорится, что « Invalid Syntax Neat '='
Это отлично работает без ‘=’.
Как я могу посчитать строки, которые записали = 1 в них и записали = 0 в них?
Спасибо, Дэн
Ответ №1:
Используйте CASE
инструкцию
COUNT(CASE WHEN Bids.Burned=0 THEN 1 END) AS 'ActiveBids',
COUNT(CASE WHEN Bids.Burned=1 THEN 1 END) AS 'BurnedBids'
Существует неявное ELSE NULL
. COUNT
учитываются NOT NULL
только значения, поэтому это даст вам нужный результат.
Комментарии:
1. Я предпочитаю использовать SUM в этом случае с ELSE 0 в инструкции case, чтобы исключить предупреждение «Нулевое значение, устраненное aggregate», которое вызывает этот код.
2. @Danpe —
COUNT(NULLIF(Bids.Burned,1))
иCOUNT(NULLIF(Bids.Burned,0))
если единственными допустимыми значениями в этом столбце являются0,1
и, возможноNULL
, являются.3. @Dave — Не думал, что
COUNT
поднимал этот вопрос, но, по-видимому, это так. Да, это еще один вариант, если предупреждения вызывают какие-либо проблемы.4. @Martin Спасибо, более короткая версия работает 🙂 и где я вижу предупреждения? И должны ли они меня беспокоить?
5. @Danpe — Они отображаются на вкладке сообщений в SSMS, если у вас
ANSI_WARNINGS
включено (что вы почти наверняка сделаете). Это информационные предупреждения, а не ошибки. Они никогда не беспокоили меня, но я полагаю, что обратная передача сообщения вашему приложению может иметь небольшие накладные расходы.