用不同的值计算同一个表上的记录可能没有sql server 2008

时间:2013-08-21 15:53:33

标签: sql sql-server sql-server-2008

我有一个库存表,其中包含一个条件,即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

提前致谢

3 个答案:

答案 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