日期:2014-05-18  浏览次数:20757 次

update 如何生成家庭排序?(问题补充)
户主 成员 身份证号 家庭地址 家庭排序
潘曰云 潘曰云 372802193412295710 东港区陈疃镇南鲍疃村 NULL
潘曰云 李曰申 372802193202095729 东港区陈疃镇南鲍疃村 NULL
潘明建 潘明建 372802196911145753 东港区陈疃镇南鲍疃村 NULL
潘明建 张传花 372802197102196520 东港区陈疃镇南鲍疃村 NULL
潘明建 潘文胜 371102199608265714 东港区陈疃镇南鲍疃村 NULL
潘明建 潘俊驰 371102201003105726 东港区陈疃镇南鲍疃村 NULL




户主 成员 身份证号 家庭地址 家庭排序
潘曰云 潘曰云 372802193412295710 东港区陈疃镇南鲍疃村 1
潘曰云 李曰申 372802193202095729 东港区陈疃镇南鲍疃村 2
潘明建 潘明建 372802196911145753 东港区陈疃镇南鲍疃村 1
潘明建 张传花 372802197102196520 东港区陈疃镇南鲍疃村 2
潘明建 潘文胜 371102199608265714 东港区陈疃镇南鲍疃村 3
潘明建 潘俊驰 371102201003105726 东港区陈疃镇南鲍疃村 4


如果成员和户主的姓名相同,家庭排序是1,其他再排序

------解决方案--------------------
SQL code

create table tb(户主 varchar(10),成员 varchar(10),身份证号 varchar(18),家庭地址 varchar(50),家庭排序 int)
insert into tb values('潘曰云', '潘曰云', '372802193412295710', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘曰云', '李曰申', '372802193202095729', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘明建', '372802196911145753', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '张传花', '372802197102196520', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘文胜', '371102199608265714', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘俊驰', '371102201003105726', '东港区陈疃镇南鲍疃村', NULL)
go

select id = identity(int,1,1) , *  into tmp from tb 
order by 户主,(case when 户主=成员 then 0 else 1 end)

update tb set 家庭排序 = (select count(1) from tmp where 户主 = t.户主 and id < t.id) + 1 from tb , tmp t where tb.身份证号 = t.身份证号 

select * from tb

drop table tb , tmp

------解决方案--------------------
SQL code

create table tb(户主 varchar(10),成员 varchar(10),身份证号 varchar(18),家庭地址 varchar(50),家庭排序 int)
insert into tb values('潘曰云', '潘曰云', '372802193412295710', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘曰云', '李曰申', '372802193202095729', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘明建', '372802196911145753', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '张传花', '372802197102196520', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘文胜', '371102199608265714', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘俊驰', '371102201003105726', '东港区陈疃镇南鲍疃村', NULL)
go

;with cte as
(
    select *,rn=row_number() over (partition by 户主 order by 户主,(case when 户主=成员 then 0 else 1 end))
    from tb
)

update a
set a.家庭排序 = b.rn
from tb a join cte b on a.身份证号 = b.身份证号

select * from tb

drop table tb

/***************************

户主         成员         身份证号               家庭地址                                               家庭排序
---------- ---------- ------------------ -------------------------------------------------- -----------
潘曰云        潘曰云        372802193412295710 东港区陈疃镇南鲍疃村                                         1
潘曰云        李曰申        372802193202095729 东港区陈疃镇南鲍疃村                                         2
潘明建        潘明建        372802196911145753 东港区陈疃镇南鲍疃村                                         1
潘明建        张传花        372802197102196520 东港区陈疃镇南鲍疃村                                         2
潘明建        潘文胜        371102199608265714 东港区陈疃镇南鲍疃村                                         3
潘明建        潘俊驰        371102201003105726 东港区陈疃镇南鲍疃村                                         4

(6 行受影响)

------解决方案--------------------
也可以采用如下方法:
1.户主 = 成员 则家庭排序=1
2.户主 = 成员 则按照身份证号码从小到大排序.

SQL code
create table tb(户主 varchar(10),成员 varchar(10),身份证号 varchar(18),家庭地址 varchar(50),家庭排序 int)
insert into tb values('潘曰云', '潘曰云', '372802193412295710', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘曰云', '李曰申', '372802193202095729', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘明建', '372802196911145753', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '张传花', '372802197102196520', '东港区陈疃镇南鲍疃村', NULL)
insert into tb values('潘明建', '潘文胜', '3711021