求一SQL 语句

songjinxi123 2012-08-19 04:19:59
有这样一个表
姓名 物品
小明 杯子
小明 手机
小红 画笔
小红 衣服
小红 眼睛
小刚 钱包
小刚 裤子
... ...


我要按姓名为组别,每次读取一个不同姓名的数据,比如
第一次读取了 小明 杯子
第二次就应该读取 小红 画笔
第三次就应该读取 小刚 钱包
...
当读到最后一个姓名之后,又从最开始的地方读取。比如
第二轮第一次读取 小明 手机
第二轮第二次读取 小红 画笔
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2012-08-20
  • 打赏
  • 举报
回复
如果只是显示顺序直接用排序

用自增列生成临时表这是不改变表的默认排序


USE tempdb
GO
--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([姓名] nvarchar(2),[物品] nvarchar(2))
Insert #T
select N'小明',N'杯子' union all
select N'小明',N'手机' union all
select N'小红',N'画笔' union all
select N'小红',N'衣服' union all
select N'小红',N'眼睛' union all
select N'小刚',N'钱包' union all
select N'小刚',N'裤子'
Go
declare @s nvarchar(4000),@i varchar(5)
Select top 1 @i=COUNT(1),@s='' from #T group by [姓名] order by COUNT(1) desc


if not object_id('Tempdb..#T1') is null
drop table #T1
select *,ID=IDENTITY(int,1,1),RN=cast(null as int) into #T1 from #T
update a
set RN=(select COUNT(1) from #T1 where [姓名]=a.[姓名] and ID<=a.ID)
from #T1 as a

SELECT [姓名],[物品] FROM #T1 ORDER BY rn,id

/*
姓名 物品
小明 杯子
小红 画笔
小刚 钱包
小明 手机
小红 衣服
小刚 裤子
小红 眼睛
*/
中国风 2012-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

忘了说了,我用的是MSSQL 2000
[/Quote]


--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([姓名] nvarchar(2),[物品] nvarchar(2))
Insert #T
select N'小明',N'杯子' union all
select N'小明',N'手机' union all
select N'小红',N'画笔' union all
select N'小红',N'衣服' union all
select N'小红',N'眼睛' union all
select N'小刚',N'钱包' union all
select N'小刚',N'裤子'
Go
declare @s nvarchar(4000),@i varchar(5)
Select top 1 @i=COUNT(1),@s='' from #T group by [姓名] order by COUNT(1) desc


if not object_id('Tempdb..#T1') is null
drop table #T1
select *,ID=IDENTITY(int,1,1),RN=cast(null as int) into #T1 from #T
update a
set RN=(select COUNT(1) from #T1 where [姓名]=a.[姓名] and ID<=a.ID)
from #T1 as a

while @i>0
select @s=' UNION ALL SELECT [姓名],[物品] FROM #T1 WHERE RN='+@i+@s ,@i=@i-1
set @s=STUFF(@s,1,10,'')
exec(@s)
/*
姓名 物品
小明 杯子
小红 画笔
小刚 钱包
小明 手机
小红 衣服
小刚 裤子
小红 眼睛
*/
songjinxi123 2012-08-19
  • 打赏
  • 举报
回复
忘了说了,我用的是MSSQL 2000
songjinxi123 2012-08-19
  • 打赏
  • 举报
回复
我的意思是每次只读取一条,不是一次把每条都读取出来。
中国风 2012-08-19
  • 打赏
  • 举报
回复

楼主是需要显示的结果?

再猜一个结果

;with a
as
(
select
[姓名],[物品],
rn=ROW_NUMBER()over(partition by [姓名] order by rn)
from
(select
*,rn=ROW_NUMBER()over(order by rand())
from #T
)t
)
select * from a where rn=1--轮数
中国风 2012-08-19
  • 打赏
  • 举报
回复
--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([姓名] nvarchar(2),[物品] nvarchar(2))
Insert #T
select N'小明',N'杯子' union all
select N'小明',N'手机' union all
select N'小红',N'画笔' union all
select N'小红',N'衣服' union all
select N'小红',N'眼睛' union all
select N'小刚',N'钱包' union all
select N'小刚',N'裤子'
Go
declare @s nvarchar(4000),@i varchar(5)
Select top 1 @i=COUNT(1),@s='' from #T group by [姓名] order by COUNT(1) desc

while @i>0
select @s=',[第'+@i+'轮]=max(case when rn='+@i+' then [物品] else '''' end)'+@s ,@i=@i-1

exec('select [姓名]'+@s+' from (select *,rn=row_number()over(partition by [姓名] order by rand()) from #T) as T group by [姓名] order by min(rn)')

/*
姓名 第1轮 第2轮 第3轮
小刚 钱包 裤子
小红 画笔 衣服 眼睛
小明 杯子 手机
*/
  • 打赏
  • 举报
回复
这个有难度,期待大版来解决。
叶子 2012-08-19
  • 打赏
  • 举报
回复

declare @T table (姓名 varchar(4),物品 varchar(4))
insert into @T
select '小明','杯子' union all
select '小明','手机' union all
select '小红','画笔' union all
select '小红','衣服' union all
select '小红','眼睛' union all
select '小刚','钱包' union all
select '小刚','裤子'

declare @i int set @i=3 --这个表示轮数(你可以改成1,2,3,4等分别看看结果)
;with maco as
(
select row_number() over
(partition by 姓名 order by (select 1)) as rid, * from @T
)
select * from maco t
where rid=
case when @i%(select count(1) from @T where 姓名=t.姓名)=0 then (select count(1) from @T where 姓名=t.姓名)
else @i%(select count(1) from @T where 姓名=t.姓名) end
人生无悔 2012-08-19
  • 打赏
  • 举报
回复

with t(id,姓名,物品) as(
select 1,'小明','杯子'
union all select 2,'小明','手机'
union all select 3,'小红','画笔'
union all select 4,'小红','衣服'
union all select 5,'小红','眼睛'
union all select 6,'小刚','钱包'
union all select 7,'小刚','裤子'
)
select 姓名,物品 from (
select row_number() over (partition by 姓名 order by id) rn,id,姓名,物品 from t) t1
order by rn,id
/*
姓名 物品
---- ----
小明 杯子
小红 画笔
小刚 钱包
小明 手机
小红 衣服
小刚 裤子
小红 眼睛

(7 行受影响)

*/

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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