一个SQL的select 语句的问题
问题是这样的,如果一个表table_1中有三个列,col_1,col_2,col_3
里面的数据如下:
col_1 col_2 col_3
1 4 张三
1 5 李四
2 3 全一
2 4 王二
2 5 周五
希望有办法,用一个或几个SQL语句,使我list出数据如下
col_1 col_2 col_3
1 1 NULL
1 2 NULL
1 3 NULL
1 4 张三
1 5 李四
1 6 NULL
1 7 NULL
1 8 NULL
2 1 NULL
2 2 NULL
2 3 全一
2 4 王二
2 5 周五
2 6 NULL
2 7 NULL
2 8 NULL
另外,,这个表里面的每组(按col_1分组)数据不一定,可能有8条,也可能有5条,也可能只有一条,,
需要list出来的数据,每组(按col_1分组)必须有8条记录,,按照col_2以升序排列,,
不知哪位高人有办法,,
[解决办法]
--创建测试环境
create table #t(col_1 int,col_2 int,col_3 varchar(20))
--插入测试数据
insert #t(col_1,col_2,col_3)
select '1 ', '4 ', '张三 ' union all
select '1 ', '5 ', '李四 ' union all
select '2 ', '3 ', '全一 ' union all
select '2 ', '4 ', '王二 ' union all
select '2 ', '5 ', '周五 '
--求解过程
select top 8 identity(int,1,1) as id into #tmp from sysobjects a,sysobjects b
select distinct col_1,id
into #tmp2
from #t
cross join #tmp
select #tmp2.col_1,#tmp2.id,#t.col_3
from #t
right join #tmp2 on #t.col_1 = #tmp2.col_1 and #t.col_2 = #tmp2.id
order by #tmp2.col_1,#tmp2.id
--删除测试环境
drop table #t,#tmp,#tmp2
/*--测试结果
col_1 id col_3
----------- ----------- --------------------
1 1 NULL
1 2 NULL
1 3 NULL
1 4 张三
1 5 李四
1 6 NULL
1 7 NULL
1 8 NULL
2 1 NULL
2 2 NULL
2 3 全一
2 4 王二
2 5 周五
2 6 NULL
2 7 NULL
2 8 NULL
*/
[解决办法]
--根据col_4确定
create table table_1(col_1 int,col_2 int,col_3 varchar(20))
--插入测试数据
insert table_1(col_1,col_2,col_3)
select '1 ', '4 ', '张三 ' union all
select '1 ', '5 ', '李四 ' union all
select '2 ', '3 ', '全一 ' union all
select '2 ', '4 ', '王二 ' union all
select '2 ', '5 ', '周五 '
select identity(int,1,1) as id into # from table_1 group by col_4
select id as col_1,tt.col_1 as col_2,col_3 from (select * from # cross join (select distinct col_1 from table_1) t )tt left join table_1 ttt on tt.col_1=ttt.col_1 and tt.id=ttt.col_2
[解决办法]
select * from
(select col_1,max(col_4) col_4 from table_1 group by col_1) a
left join (select 1 Num union all select 2 ....union all select MaxN) --建议在你的库里建好一个序数表
b on b.Num <=a.col_4
left join table_1 c on a.col_1=c.col_1 and b.num=ccol_2
order by ....
[解决办法]
nthb2002(贝思特) ( ) 信誉:100 Blog 2007-03-08 16:07:04 得分: 0
....谢了,。。。
能否再问一个问题,,
如果那个8条记录变为N条记录,,这个N跟据table_1中第四个列col_4来确定的话,可不可以实现????
-------------
也可以,那就借用臨時表,像樓上那麼用。
[解决办法]
可以這麼寫
Create Table TEST
(col_1Int,
col_2Int,
col_3Nvarchar(10),
col_4Int)
Insert TEST Select 1, 4, N '張三 ', 8
Union All Select 1, 5, N '李四 ', 8
Union All Select 2, 3, N '全一 ', 6
Union All Select 2, 4, N '王二 ', 6
Union All Select 2, 5, N '周五 ', 6
GO
Select Top 100 Identity(Int, 1, 1) As col_2 Into #T from Sysobjects A, Sysobjects B
Select
C.col_1,
C.col_2,
D.col_3,
(Select Max(col_4) From TEST Where col_1 = C.col_1) As col_4
From
(
Select * From (
Select Distinct col_1 From TEST) A
Cross Join
#T
) C
Left Join
TEST D
On
C.col_1 = D.col_1 And C.col_2 = D.col_2
Where
C.col_2 <= (Select Max(col_4) From TEST Where col_1 = C.col_1)
Drop Table #T
GO
Drop Table TEST
GO
--Result
/*
col_1col_2col_3col_4
11NULL8
12NULL8
13NULL8
14張三8
15李四8
16NULL8
17NULL8
18NULL8
21NULL6
22NULL6
23全一6
24王二6
25周五6
26NULL6
*/