一个SQL的select 语句的问题

nthb2002 2007-03-08 03:42:20
问题是这样的,如果一个表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以升序排列,,


不知哪位高人有办法,,
...全文
514 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fire_qu 2007-03-09
  • 打赏
  • 举报
回复
MARK,学习了
paoluo 2007-03-09
  • 打赏
  • 举报
回复
可以這麼寫

Create Table TEST
(col_1 Int,
col_2 Int,
col_3 Nvarchar(10),
col_4 Int)
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_1 col_2 col_3 col_4
1 1 NULL 8
1 2 NULL 8
1 3 NULL 8
1 4 張三 8
1 5 李四 8
1 6 NULL 8
1 7 NULL 8
1 8 NULL 8
2 1 NULL 6
2 2 NULL 6
2 3 全一 6
2 4 王二 6
2 5 周五 6
2 6 NULL 6
*/

nthb2002 2007-03-08
  • 打赏
  • 举报
回复
select top 8 identity(int,1,1) as id into #tmp from sysobjects a,sysobjects b 这个吗???


我是说:,我的col_4也是按不同的分组(按col_1分组)值不同,,例如:

col_1 col_2 col_3  col_4
1 4 张三 8
1 5 李四 8
2 3 全一 6
2 4 王二 6
2 5 周五 6

这样应该如何实现呢??

在这个时候,,临时表怎么建??
mengmou 2007-03-08
  • 打赏
  • 举报
回复
我不是把用临时表的方法贴出来了么?
nthb2002 2007-03-08
  • 打赏
  • 举报
回复
嗯,,我又碰到新问题了,,,用临时表,,我应该怎么写呢??难道用循环语句,,,
nthb2002 2007-03-08
  • 打赏
  • 举报
回复
嗯,,可能只有用临时表了,,真希望有不用临时表的方法,,,

不过还是要感谢各位。。。

大家想想还有什么办法吧,,晚上我再结贴,,,
zhou80bin 2007-03-08
  • 打赏
  • 举报
回复
select 1 'col_4' into #table_2
union
select 2
union
select 3
union
select 4
union
select 5
union
select 6
union
select 7
union
select 8



select a.col_1,a.col_4,b.col_3 from

(
select a.col_1,b.col_4
from #table_2 b
left join (select distinct col_1 from table_1) a
on 1=1

) a
left join table_1 b
on a.col_1 = b.col_1 and a.col_4 = b.col_2
order by a.col_1,a.col_4
feixiangVB 2007-03-08
  • 打赏
  • 举报
回复
刷的真快!
feixiangVB 2007-03-08
  • 打赏
  • 举报
回复
頂樓上,正解
nthb2002 2007-03-08
  • 打赏
  • 举报
回复
谢谢楼上帮我想办法,,可能你没有考虑到一点,,,我的col_4也是按不同的分组(按col_1分组)值不同,,例如:

col_1 col_2 col_3  col_4
1 4 张三 8
1 5 李四 8
2 3 全一 6
2 4 王二 6
2 5 周五 6

这样应该如何实现呢??先谢谢各位了,,,
paoluo 2007-03-08
  • 打赏
  • 举报
回复
nthb2002(贝思特) ( ) 信誉:100 Blog 2007-03-08 16:07:04 得分: 0


....谢了,。。。

能否再问一个问题,,

如果那个8条记录变为N条记录,,这个N跟据table_1中第四个列col_4来确定的话,可不可以实现????
-------------

也可以,那就借用臨時表,像樓上那麼用。

CrazyFor 2007-03-08
  • 打赏
  • 举报
回复
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 ....
jacobsan 2007-03-08
  • 打赏
  • 举报
回复
--根据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
nthb2002 2007-03-08
  • 打赏
  • 举报
回复
....谢了,。。。

能否再问一个问题,,

如果那个8条记录变为N条记录,,这个N跟据table_1中第四个列col_4来确定的话,可不可以实现????
mengmou 2007-03-08
  • 打赏
  • 举报
回复
嗯。
paoluo 2007-03-08
  • 打赏
  • 举报
回复
如果每個col_1只是8條數據,可以不用創建臨時表來實現。
paoluo 2007-03-08
  • 打赏
  • 举报
回复
Create Table TEST
(col_1 Int,
col_2 Int,
col_3 Nvarchar(10))
Insert TEST Select 1, 4, N'张三'
Union All Select 1, 5, N'李四'
Union All Select 2, 3, N'全一'
Union All Select 2, 4, N'王二'
Union All Select 2, 5, N'周五'
GO
Select
C.col_1,
C.col_2,
D.col_3
From
(
Select * From (
Select Distinct col_1 From TEST) A,
(Select 1 As col_2
Union Select 2
Union Select 3
Union Select 4
Union Select 5
Union Select 6
Union Select 7
Union Select 8) B
) C
Left Join
TEST D
On C.col_1 = D.col_1 And C.col_2 = D.col_2
GO
Drop Table TEST
GO
--Result
/*
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
*/
mengmou 2007-03-08
  • 打赏
  • 举报
回复
--创建测试环境
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
*/



jianojian 2007-03-08
  • 打赏
  • 举报
回复
大哥 根本没有 怎么 select 出来啊!?帮你顶着,难
CrazyFor 2007-03-08
  • 打赏
  • 举报
回复
select * from
(select col_1 from table_1 group by col_1) a
left join (select 1 Num union all select 2 ....union all select 8) b on 1=1
left join table_1 c on a.col_1=c.col_1 and b.num=ccol_2
order by ....

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧