围绕T-SQL中的case语句混淆

时间:2014-01-06 14:04:13

标签: sql sql-server tsql

有人可以帮助我解决以下两个陈述之间的区别。他们俩都给我相同的结果吗?

SELECT    
      COUNT( CASE WHEN DischargeDate > '20130609' and DischargeDate < '20140101' THEN Encounter END) as '1case'
      COUNT( CASE WHEN DischargeDate > '20130509' and DischargeDate < '20131201' THEN Encounter END) as '2case'
      COUNT( CASE WHEN DischargeDate > '20130409' and DischargeDate < '20131101' THEN Encounter END) as '3case'
FROM Table 1

SELECT    
    COUNT( CASE 
           WHEN DischargeDate > '20130609' and DischargeDate < '20140101' THEN Encounter    
           WHEN DischargeDate > '20130509' and DischargeDate < '20131201' THEN Encounter    
           WHEN DischargeDate > '20130409' and DischargeDate < '20131101' THEN Encounter  )
    END AS 'CaseValues'  
    FROM Table 1

你能解释一下上面代码之间的区别吗?结果如何变化?如果我将计数更改为SUM怎么办?

我想结果这样的事情。
  日期范围          (DischargeDate&gt;'20130609'和DischargeDate&lt;'20140101')我将其称为1      DischargeDate&gt; '20130509'和DischargeDate&lt; '20131201'我将其称为2
         DischargeDate&gt; '20130409'和DischargeDate&lt; '20131101'我将其称为3  我想要上述每一项的遭遇计数。

 Result like :
 EncounterCount     Date
 30                  1
 45                  2
 20                  3

3 个答案:

答案 0 :(得分:2)

第一个语句将返回包含1行和3列的结果集:

  1. 2013年6月9日至12月31日count()Encounter的{​​{1}}
  2. 2013年5月9日至11月30日DischargeDatecount()的{​​{1}}
  3. 2013年4月9日至10月31日EncounterDischargeDate的{​​{1}}
  4. 请注意,这些日期中的每个日期都排除在第一天的午夜 - 考虑您是否需要&gt; =而不是&gt;。

    第二个选择将返回一行结果,其中包含1行和 1 列,这是{2013年4月9日至12月31日期间count()的{​​{1}} - 即所有其中任何一个时期的下降。

    Encounter是非空值的数量。假设DischargeDate是某种形式的数字列,将count()更改为Encounter将为您提供count()列中所有非空值的总和。

    鉴于更新后问题中的信息,我建议如下:

    Encounter

    当然,而不是CTE中的硬编码值(主count()之前的sum()表达式),您可以使用表格或某种方式生成日期。

答案 1 :(得分:1)

查询为自己回答问题。第一个查询是每个case语句的单独计数。因此,您将在该查询的结果中包含3列。

第二个查询是所有case语句的结果集的计数,并且将得到仅1列和1行的结果集。

这取决于您要实现的目标,但如果要求是灵活的,那么这也可以通过条件轻松完成。

更新了问题的答案

create #temp (Encounter int, Date int)
insert into #temp

select count (*) , '1'
from Mytable
where DischargeDate > '20130609' and DischargeDate < '20140101'

union all

select count (*) , '2'
from Mytable
where DischargeDate > '20130509' and DischargeDate < '20131201'

union all

select count (*) , '3'
from Mytable
where DischargeDate > '20130409' and DischargeDate < '20131101'

select * from #temp

drop table #temp

答案 2 :(得分:1)

它们将平凡地产生不同的结果,因为第一个查询中的三个表达式使用重叠的日期范围 - 因此同一行可能会多次计数。而在第二个查询中,每行只能计算一次。

考虑3行:

DischargeDate, Encounter
20130901     , 1
20130410     , 1
20131231     , 1

第一个查询将返回:

2,      1,       2

第二个查询将返回:

3

我无法与那些我通常熟悉的任何平等概念相协调。