我正在使用SQL Server 2008。
我正在编写一个查询,我需要计算多少个(1)和多少个(0或NULL)。
SELECT B.Brand, B.BrandID, COUNT(M.ModelID) AS TotalModels
FROM Brands B LEFT JOIN Models M ON B.BrandID = M.BrandID
GROUP BY B.Brand, B.BrandID
ORDER BY B.Brand
Model表中有另一个名为IsBestValue的字段,它将为NULL,0或1.我希望能够计算TotalBestValueYes,TotalBestValueNo和TotalBestValueNULL。
很久以前......我习惯使用像..
这样的东西(CASE WHEN IsBestValue = 1 END) // ADD ONE TO TotalBestValueYes
(CASE WHEN IsBestValue = 0 END) // ADD ONE TO TotalBestValueNo
(CASE WHEN IsBestValue = NULL END) // ADD ONE TO TotalBestValueNULL
在时尚中使用CASE是个好主意吗?馊主意?矫枉过正?
有没有更好的方法来计算yes和nos和NULL?
答案 0 :(得分:6)
CASE
(双关语)是完美的案例。
CASE
是一个非常优化的运算符,专为此类使用场景而设计。
条件计数的正常语法如下:
SELECT SUM (CASE WHEN x=y then 1 ELSE 0 END) as 'XequalsY'
...
答案 1 :(得分:6)
如果这是你的意思,我认为使用CASE没有任何问题。
SELECT B.Brand,
B.BrandID,
COUNT(M.ModelID) AS TotalModels,
SUM((CASE WHEN M.IsBestValue = 1 THEN 1 ELSE 0 END)) TotalBestValueYes,
SUM((CASE WHEN M.IsBestValue = 0 THEN 1 ELSE 0 END)) TotalBestValueNo,
SUM((CASE WHEN M.IsBestValue IS NULL THEN 1 ELSE 0 END)) TotalBestValueNull,
FROM Brands B
LEFT JOIN Models M ON B.BrandID = M.BrandID
GROUP BY B.Brand,
B.BrandID
ORDER BY B.Brand
答案 2 :(得分:2)
select count(nullif(IsBestValue, 0)) as TotalBestValueYes,
count(nullif(IsBestValue, 1)) as TotalBestValueNo,
count(case when IsBestValue is null then 1 end) as TotalBestValueNull