2016-12-27 32 views
0

我有实体有2个答案y/n。SQL Server 2008,如何计算不同的值的变化

我需要计算在stage1和stage2之间将回答从'n'更改为'y'的实体的数量。

entity || answer || stage 
    a || y || 1 
    a || n || 2 
    b || y || 1 
    b || y || 2 
    c || n || 1 
    c || n || 1 
    d || n || 1 
    d || y || 2 

我试过,但这个不工作(因为它计算谁改变答案的所有实体)

select 
    entity, count(distinct answer) 
from 
    myDB 
where 
    stage between '1' and '2' 
group by 
    entity, answer 

,但我不明白为什么这不起作用,结果出来全0

select 
    entity, 
    case 
     when stage = '1' and answer = 'n' and 
      stage = '2' and answer = 'y' then 1 
     else 0 
    end as 'result' 
from 
    myDB 
where 
    stage between '1' and '2' 
group by 
    entity, stage, answer 
+2

是那些TWP单独的列或单列? – Rahul

+0

你不能有两个同名的列... – jarlh

+0

抱歉,单列。我使它看起来像两列... – Nayana

回答

2
select count(*) 
from myDB s2 
where 
    s2.stage ='2' and s2.answer='y' 
    and exists (select * from myDB s1 
       where s1.entity=s2.entity 
       and s1.stage ='1' and s1.answer='n' 
       ) 
0
select  count(*) 

from  (select  1 as x 
      from  myDB 
      where  stage in (1,2) 
      group by entity 
      having  min(case when stage = 1 then answer end) = 'n' 
        and max(case when stage = 2 then answer end) = 'y' 
      ) t 
0
select count(*) 
from (select entity,stage,answer from myDB) t 
      pivot (max(answer) for stage in([1],[2])) p 
where [1] = 'n' and [2] = 'y' 
0
select 
    count(*) 
from 
    [myDb] as [s1] 
inner join 
    [myDb] as [s2] 
on 
     [s1].[entity] = [s2].[entity] 
    and [s1].[answer] = 'n' 
    and [s1].[stage] = 1 
    and [s2].[answer] = 'y' 
    and [s2].[stage] = 2; 

但是,它与你唯一提供的数据。 如果你有重复的实体,它不起作用,因为在这种情况下,不可能识别实体的唯一性。那么你需要额外的数据。

a y 1 
a n 2 
b y 1 
b y 2 
c n 1 
c n 2 
d n 1 
d y 2 
d n 1 
d y 2 

让我们做出的假设,同样的逻辑实体值存储此起彼伏。然后,你可以使用此查询处理这个问题:

declare @myDB TABLE 
(
    [rec_id] int   identity(1, 1) 
    ,[entity] varchar(10) 
    ,[answer] varchar(10) 
    ,[stage] int 
); 


insert into @myDB 
( 
    [entity] 
    ,[answer] 
    ,[stage] 
) 
select 
    [entity] 
    ,[answer] 
    ,[stage] 
from 
    [myDB]; 


select 
    [s1].[entity] 
    ,count([s1].[entity]) 
from 
    @myDB as [s1] 
inner join 
    @myDB as [s2] 
on 
     [s1].[entity] = [s2].[entity] 
    and [s1].[answer] = 'n' 
    and [s1].[stage] = 1 
    and [s2].[answer] = 'y' 
    and [s2].[stage] = 2 
    and [s1].[rec_id] = [s2].[rec_id] - 1 
group by 
    [s1].[entity];