首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个排序如题的咨询.该如何解决

2012-01-03 
一个排序如题的咨询. CREATETABLE[dbo].[USER_BAOMING]([身份证号][varchar](20)COLLATEChinese_PRC_CI_AS

一个排序如题的咨询.

CREATE   TABLE   [dbo].[USER_BAOMING]   (
[身份证号]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,
[姓名]   [nvarchar]   (100)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[性别]   [char]   (1)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[出生日期]   [datetime]   NULL   ,
[工作单位]   [nvarchar]   (200)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[职务职称]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[是否离退休]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[岗位系列]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[是否置换区职工]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[是否双职工]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[备注]   [varchar]   (1000)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[审核标志]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[电子邮件]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[手机座机]   [varchar]   (100)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[得分]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[排队方式]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[座机]   [varchar]   (100)   COLLATE   Chinese_PRC_CI_AS   NULL  
)   ON   [PRIMARY]
GO


表结构如上,现要进行一个排队,其中有一个字段为   是否离退休    
如果否,即为该同志“在职”,在其它表中代码为:1010,如果是,代码为1000,
现在职与离退休要穿叉排队,比例为5:1,即5名在职职工后穿叉一名离退休职工,请问此如何进行,请各位帮帮忙,谢谢了。



[解决办法]
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(身份证号 varchar(18) , 是否离退休 varchar(4))
insert into tb(身份证号,是否离退休) values( '00000000000000000 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000001 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000002 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000003 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000004 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000005 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000006 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000007 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000008 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000009 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '10000000000000000 ', '1000 ')
insert into tb(身份证号,是否离退休) values( '20000000000000000 ', '1000 ')
go

select px = identity(int,1,1) , * into tb1 from tb where 是否离退休 = '1010 ' order by 身份证号
select px = identity(int,1,1) , * into tb2 from tb where 是否离退休 = '1000 ' order by 身份证号

select 身份证号,是否离退休 from
(
select (px-1)/5 + 1 px , 身份证号,是否离退休 from tb1
union all
select * from tb2
) t
order by px , 身份证号
drop table tb,tb1,tb2

/*
身份证号 是否离退休
------------------ -----
00000000000000000 1010
00000000000000001 1010
00000000000000002 1010
00000000000000003 1010
00000000000000004 1010
10000000000000000 1000


00000000000000005 1010
00000000000000006 1010
00000000000000007 1010
00000000000000008 1010
00000000000000009 1010
20000000000000000 1000

(所影响的行数为 12 行)
*/
[解决办法]
--借用楼上数据


create table tb(身份证号 varchar(18) , 是否离退休 varchar(4))
insert into tb(身份证号,是否离退休) values( '00000000000000000 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000001 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000002 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000003 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000004 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000005 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000006 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000007 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000008 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000009 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '10000000000000000 ', '1000 ')
insert into tb(身份证号,是否离退休) values( '20000000000000000 ', '1000 ')
go


--生成的临时表px字段,初始值为10,布进值为10
select identity(int,10,10) as px , * into tb1 from tb where 是否离退休 = '1010 ' order by 身份证号

--生成的临时表px字段,初始值为50,布进值为50
select identity(int,50,50) as px , * into tb2 from tb where 是否离退休 = '1000 ' order by 身份证号


--50之后插一个51,100之后插一个101,以此类推
select px,身份证号,是否离退休 from
(
select px , 身份证号,是否离退休 from tb1
union all
select px+1 , 身份证号,是否离退休 from tb2
) t
order by px , 身份证号

drop table tb,tb1,tb2

[解决办法]
create table tb(身份证号 varchar(18) , 是否离退休 varchar(4))
insert into tb(身份证号,是否离退休) values( '00000000000000000 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000001 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000002 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000003 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000004 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000005 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000006 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000007 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000008 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '00000000000000009 ', '1010 ')
insert into tb(身份证号,是否离退休) values( '10000000000000000 ', '1000 ')
insert into tb(身份证号,是否离退休) values( '20000000000000000 ', '1000 ')
go

select px = identity(int,1,1) , * into tb1 from tb where 是否离退休 = '1010 ' order by 身份证号
select px = identity(int,1,1) , * into tb2 from tb where 是否离退休 = '1000 ' order by 身份证号

select *
from
(select * from tb1
union all
select px*5,身份证号,是否离退休 from tb2
)tmp order by px asc,是否离退休 desc

px 身份证号 是否离退休
----------- ------------------ -----
1 00000000000000000 1010
2 00000000000000001 1010
3 00000000000000002 1010
4 00000000000000003 1010
5 00000000000000004 1010
5 10000000000000000 1000
6 00000000000000005 1010
7 00000000000000006 1010


8 00000000000000007 1010
9 00000000000000008 1010
10 00000000000000009 1010
10 20000000000000000 1000

(12 行受影响)

热点排行