2016-12-27 49 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];