2014-10-16 58 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

相关问题