2014-10-16 62 views
-1

我有這個表:T-SQL遊標或者或情況下

Table_NAME_A

quotid itration QStatus    
-------------------------------- 
5329 1   Assigned         
5329 2   Inreview         
5329 3   sold           
4329 1   sold      
4329 2   sold      
3214 1   assigned     
3214 2   Inreview 

結果輸出應該是這樣的:

quotid itration QStatus 
------------------------------   
5329 3   sold      
4329 2   sold      
3214 2   Inreview 

T-SQL查詢,所以基本上我希望數據處於「已售出」狀態(如果不存在),那麼如果不存在,那麼「未檢查」然後「已分配」,並且同時如果「已售出」或「檢查」或「已分配」具有多次迭代,那麼我希望最高「迭代」。

請幫助我,在此先感謝:)

+3

堆棧溢出不是一個代碼寫入服務;你需要展示你到目前爲止已經嘗試了什麼,哪些沒有成功。就目前而言,這只是一個沒有顯示的努力的要求。 – LittleBobbyTables 2014-10-16 14:31:45

+0

您使用的是什麼RDBMS? – 2014-10-16 14:32:28

+0

我正在使用sql server managment studio,換句話說tsql。非常感謝您的快速週轉 – 2014-10-16 14:35:51

回答

0

你既不希望遊標也不希望/然後爲此。相反,您將使用一系列自連接來獲得這些結果。我也將使用一個CTE來簡化獲取最大迭代的每一步:

with StatusIterations As 
(
    SELECT quotID, MAX(itration) Iteration, QStatus 
    FROM table_NAME_A 
    GROUP BY quotID, QStats 
) 
select q.quotID, coalesce(sold.Iteration,rev.Iteration,asngd.Iteration) Iteration, 
       coalesce(sold.QStatus, rev.QStatus, asngd.QStatus) QStatus 
from 
    --initial pass for list of quotes, to ensure every quote is included in the results 
    (select distinct quotID from table_NAME_A) q 
--one additional pass for each possible status 
left join StatusIterations sold on sold.quotID = q.quotID and sold.QStatus = 'sold' 
left join StatusIterations rev on rev.quotID = q.quotID and rev.QStatus = 'Inreview' 
left join StatusIterations asngd on asngd.quotID = q.quotID and asngd.QStatus = 'assigned' 

如果您有等同於數值的狀態的表,可以進一步對這個改善:

表:狀態

 
QStatus Sequence 
'Sold'  3 
'Inreview' 2 
'Assigned' 1

和代碼變爲:

select t.quotID, MAX(t.itration) itration, t.QStatus 
from 
(
    select t.quotID, MAX(s.Sequence) As Sequence 
    from table_NAME_A t 
    inner join Status s on s.QStatus = t.QStatus 
    group by t.quotID 
) seq 
inner join Status s on s.Sequence = seq.Sequence 
inner join table_NAME_A t on t.quotID = seq.quotID and t.QStatus = s.QStatus 
group by t.quoteID, t.QStatus 

上面看起來可能看起來很複雜,但它可以更快,並且可以在不更改代碼的情況下輕鬆擴展超過三種狀態。

+0

嘿Coehoorn,這是合法的答案,它的工作非常感謝你,我一直試圖從最近2天,你在幾分鐘之內做到了大聲笑再次感謝這麼多:) – 2014-10-16 15:11:37

1

這是一個優先級查詢。要做到這一點的方法之一是在union all連續的比較:

select a.* 
from table_a a 
where quote_status = 'sold' 
union all 
select a.* 
from table_a a 
where quote_status = 'Inreview' and 
     not exists (select 1 from table_a a2 where a2.quoteid = a.quoteid and a2.quotestatus = 'sold') 
union all 
select a.* 
from table_a a 
where quote_status = 'assigned' and 
     not exists (select 1 
        from table_a a2 
        where a2.quoteid = a.quoteid and a2.quotestatus in ('sold', 'Inreview') 
       ); 

有關較大的一組數據的表現,你會想在table_a(quoteid, quotestatus)的索引。

+0

嘿Linoff感謝您的快速回復,似乎它的工作,但對我來說問題仍然存在迭代。如果出售有兩次迭代,我只想要最高的迭代,而不是更低,再次感謝您的巨大幫助 – 2014-10-16 14:53:05

+0

嘿它可以,如果你忙,我認爲科恩霍恩先生指出的工作方式也是在你的下面,但再次感謝你的幫助再來 – 2014-10-16 15:13:02

相關問題