当前位置: 代码迷 >> Sql Server >> 求1sql,非常感谢
  详细解决方案

求1sql,非常感谢

热度:51   发布时间:2016-04-24 09:57:55.0
求一sql,非常感谢。
当name_有现场处理的时候,取现场处理,多个现场处理的时候取第2个现场处理。
当name_没有现场处理的时候(网维和客服都存在),取网维处理,没有网维处理的时候取客服处理。
不管什么情况都不会取到过滤分派或回访对应的数据

表结构如下(以id排序,proc_inst_id分组,name数据不固定):

ID_ PROC_INST_ID_ NAME_ ASSIGNEE_
85224 85217               过滤分派 191500256
85231 85217              现场处理 191500389
85236 85217              网维处理 191500112
85241 85217               客服处理 191500156
85246 85217               回访 191500156

------解决思路----------------------


with  cte(ID ,PROC_INST_ID_,_NAME ,ASSIGNEE_) as  
(
select 85224,85217,'过滤分派', 191500256 union all
select 85231,85217,'现场处理', 191500389 union all
select 85236,85217,'网维处理', 191500112 union all
select 85241,85217,'客服处理', 191500156 union all
select 85246,85217,'回访', 191500156 union all
select 85247,85217,'现场处理', 191500156 --union all
--select 85248,85217,'现场处理', 191500156
),
cte1 as
(
select ID,_NAME,PROC_INST_ID_,ASSIGNEE_ 
,ROW_NUMBER() over (PARTITION by _name order by id) n--用来查找第二个现场处理
,case 
when _NAME = '现场处理' then 1 
when _NAME = '网维处理' then 2 
when _NAME = '客服处理' then 3 else 4 end n1--最后按照n1排序取结果

from cte
where  _NAME <>'回访' and _NAME<>'过滤分派'

),
cte2 as 
(
--取现场处理
select * from cte1 
where id in 
(
select MAX(id) 
from cte1 
where n<=2 and n1 = 1--取第二个现场处理
group by n1

union all
--其余数据
select * from cte1
where n1<>1
)
select top 1 ID ,PROC_INST_ID_,_NAME ,ASSIGNEE_ from cte2
order by n1

/*
ID          PROC_INST_ID_ _NAME    ASSIGNEE_
----------- ------------- -------- -----------
85247       85217         现场处理     191500156

(1 行受影响)
*/

------解决思路----------------------
引用:
Quote: 引用:

添加一些測試數據,不知道結果是不是你想要的,因為邏輯有點複雜,代碼有點多。另外你在測試時只要將代碼中的繁體中文改成簡體中文就OK了。

不管什么情况,取到的数据只会有1条哦,能否将测试数据放在最外层,方便加条件测试呢,我需要将这个语句当作一个表和另外一个表连接

确认一下你的逻辑。
1)同一PROC_INST_ID_,Name='现场处理'的数据只有一条,就选这一条。
2)同一PROC_INST_ID_,Name='现场处理'的数据大于等于两条,就选第二条。
3)同一PROC_INST_ID_,Name!='现场处理'的数据,就选Name=‘网维处理’的数据(第一条)。
4)同一PROC_INST_ID_,Name!='现场处理'且Name!=‘网维处理’的数据,就选Name=‘客服处理’的数据(第一条)。
5)不管什么情况都不会取到过滤分派或回访对应的数据。

照你的逻辑,在同一PROC_INST_ID_,Name没有‘现场处理’,‘网维处理’,‘客服处理’的数据,这样就会找不出这个PROC_INST_ID_的数据,不是吗?


create table  cte(ID  int  ,PROC_INST_ID_ int,    NAME  nvarchar(10)  ,ASSIGNEE_ varchar(20)) 
insert cte 
select 85224,    85217,'過濾分派',191500256 union all
select 85231,    85217,'現場處理',191500389 union all
select 85236,    85217, '網維處理',191500112 union all
select 85241,    85217,'客服處理',191500156 union all
select 85246,    85217, '回訪',191500156 union all
select 85249,    85217, '現場處理',191500156 union all
select 85224,    85218,'過濾分派',191500256 union all
select 85236,    85218, '網維處理',191500112 union all
select 85241,    85218,'客服處理',191500156 union all
select 85246,    85218, '回訪',191500156 union all
select 85249,    85218, '現場處理',191500156 union all
select 85224,    85219,'過濾分派',191500256 union all
select 85236,    85219, '網維處理',191500112 union all
select 85241,    85219,'客服處理',191500156 union all
select 85246,    85219, '回訪',191500156 union all
select 85224,    85220,'過濾分派',191500256 union all
select 85231,    85220,'現場處理',191500389 union all
select 85236,    85220, '網維處理',191500112 union all
select 85241,    85220,'客服處理',191500156 union all
select 85246,    85220, '回訪',191500156 union all
select 85249,    85220, '現場處理',191500156 union all
select 85247,    85220,'現場處理',191500389 union all
select 85224,    85221,'過濾分派',191500256 union all
  相关解决方案