我有一个库存表,其中包含一个条件,即new,used,other,我查询一小部分此数据,并且所有记录集都可能只包含1个或所有条件。我尝试使用case语句,但如果找不到其中一个条件,则返回该条件,我需要它返回0
这是我到目前为止所尝试的:
select(
case
when new_used = 'N' then 'new'
when new_used = 'U' then 'used'
when new_used = 'O' then 'other'
end
)as conditions,
count(*) as count
from myDB
where something = something
group by(
case
when New_Used = 'N' then 'new'
when New_Used = 'U' then 'used'
when New_Used = 'O' then 'other'
end
)
这将返回如下数据:
conditions | count
------------------
new 10
used 45
我正在尝试按以下方式返回数据:
conditions | count
------------------
new | 10
used | 45
other | 0
提前致谢
答案 0 :(得分:3)
;WITH constants(letter,word) AS
(
SELECT l,w FROM (VALUES('N','new'),('U','used'),('O','other')) AS x(l,w)
)
SELECT
conditions = c.word,
[count] = COUNT(x.new_used)
FROM constants AS c
LEFT OUTER JOIN dbo.myDB AS x
ON c.letter = x.new_used
AND something = something
GROUP BY c.word;
答案 1 :(得分:2)
试试这个 -
DECLARE @t TABLE (new_used CHAR(1))
INSERT INTO @t (new_used)
SELECT t = 'N'
UNION ALL
SELECT 'N'
UNION ALL
SELECT 'U'
SELECT conditions, ISNULL(r.cnt, 0) AS [count]
FROM (
VALUES('U', 'used'), ('N', 'new'), ('O', 'other')
) t(c, conditions)
LEFT JOIN (
SELECT new_used, COUNT(1) AS cnt
FROM @t
--WHERE something = something
GROUP BY new_used
) r ON r.new_used = t.c
输出中的-
new 2
used 1
other 0
答案 2 :(得分:0)
您可以将其作为交叉表:
select
sum(case when new_used = 'N' then 1 else 0 end) as N,
sum(case when new_used = 'U' then 1 else 0 end) as U,
sum(case when new_used = 'O' then 1 else 0 end) as Other
from myDB
where something = something