SQL查询中一对多 如何将多个值合并到相同条件下

nippycn 2018-07-26 07:28:21
表A中
ID name
1 刘德华
2 张杰
3 林俊杰

表B中
ID AID SNAME
1 1 冰雨
2 1 爱你一万年
3 2 三生三世
4 1 我恨我痴心
5 2 这就是爱
6 3 小酒窝
7 2 逆战
8 3 醉赤壁
9 3 江南
10 2 给女儿的一封信

我现在想得到结果(后面的sName1-10字段根据实际增长到10个以内)
ID AName SName1 SName2 SName3 SName4
1 刘德华 冰雨 爱你一万年 我恨我痴心
2 张杰 三生三世 这就是爱 逆战 给女儿的一封信
3 林俊杰 小酒窝 醉赤壁 江南

这个代码要如何写?求助中?
...全文
1603 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2018-07-27
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([ID] int,[name] nvarchar(23))
Insert #A
select 1,N'刘德华' union all
select 2,N'张杰' union all
select 3,N'林俊杰'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([ID] int,[AID] int,[SNAME] nvarchar(27),[Stime] nvarchar(27))
Insert #B
select 1,1,N'冰雨',N'1998-10' union all
select 2,1,N'爱你一万年',N'2000-08' union all
select 3,2,N'三生三世',N'2017-03' union all
select 4,1,N'我恨我痴心',N'1996-10' union all
select 5,2,N'这就是爱',N'2011-05' union all
select 6,3,N'小酒窝',N'2008-09' union all
select 7,2,N'逆战',N'2012-01' union all
select 8,3,N'醉赤壁',N'2008-10' union all
select 9,3,N'江南',N'2004-06' union all
select 10,2,N'给女儿的一封信',N'2018-05'
Go
--测试数据结束
DECLARE @sql VARCHAR(MAX)
SET @sql = 'select AId,#A.Name'
SELECT @sql = @sql + ',max(case Stime when ''' + Stime
+ ''' then SNAME else null end)[' + Stime + ']'
FROM ( SELECT DISTINCT
Stime
FROM #B
) a
SET @sql = @sql
+ 'from #B join #A on #a.Id = Aid group by AId,#A.Name order by AId'
EXEC(@sql)





二月十六 2018-07-27
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([ID] int,[name] nvarchar(23))
Insert #A
select 1,N'刘德华' union all
select 2,N'张杰' union all
select 3,N'林俊杰'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([ID] int,[AID] int,[SNAME] nvarchar(27),[Stime] nvarchar(27))
Insert #B
select 1,1,N'冰雨',N'1998-10' union all
select 2,1,N'爱你一万年',N'2000-08' union all
select 3,2,N'三生三世',N'2017-03' union all
select 4,1,N'我恨我痴心',N'1996-10' union all
select 5,2,N'这就是爱',N'2011-05' union all
select 6,3,N'小酒窝',N'2008-09' union all
select 7,2,N'逆战',N'2012-01' union all
select 8,3,N'醉赤壁',N'2008-10' union all
select 9,3,N'江南',N'2004-06' union all
select 10,2,N'给女儿的一封信',N'2018-05'
Go
--测试数据结束
DECLARE @sql VARCHAR(8000)
SET @sql = ';WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY AID ORDER BY Stime)rn from #B
)
select AId,#A.Name'
;WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY AID ORDER BY Stime)rn from #B
)
SELECT @sql = @sql + ',max(case rn when ' + RTRIM(rn)
+ ' then SNAME else null end)[SNAME' + RTRIM(rn) + ']'+ ',max(case rn when ' + RTRIM(rn)
+ ' then Stime else null end)[Stime' + RTRIM(rn) + ']'
FROM ( SELECT DISTINCT
cte.rn
FROM cte
) a
SET @sql = @sql
+ ' from cte join #A on #a.Id = Aid group by AId,#A.Name order by AId'
EXEC(@sql)




二月十六 2018-07-27
  • 打赏
  • 举报
回复
引用 8 楼 nippycn 的回复:
版主 我的意思是在query的查询语句中,可以使用这种带定义变量的过程吗?

可以写成一个存储过程调用
nippycn 2018-07-27
  • 打赏
  • 举报
回复
版主 我的意思是在query的查询语句中,可以使用这种带定义变量的过程吗?
nippycn 2018-07-27
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#A') is null
	drop table #A
Go
Create table #A([ID] int,[name] nvarchar(23))
Insert #A
select 1,N'刘德华' union all
select 2,N'张杰' union all
select 3,N'林俊杰'
GO
if not object_id(N'Tempdb..#B') is null
	drop table #B
Go
Create table #B([ID] int,[AID] int,[SNAME] nvarchar(27),[Stime] nvarchar(27))
Insert #B
select 1,1,N'冰雨',N'1998-10' union all
select 2,1,N'爱你一万年',N'2000-08' union all
select 3,2,N'三生三世',N'2017-03' union all
select 4,1,N'我恨我痴心',N'1996-10' union all
select 5,2,N'这就是爱',N'2011-05' union all
select 6,3,N'小酒窝',N'2008-09' union all
select 7,2,N'逆战',N'2012-01' union all
select 8,3,N'醉赤壁',N'2008-10' union all
select 9,3,N'江南',N'2004-06' union all
select 10,2,N'给女儿的一封信',N'2018-05'
Go
--测试数据结束
DECLARE @sql VARCHAR(MAX)
SET @sql = 'select AId,#A.Name'
SELECT  @sql = @sql + ',max(case Stime when ''' + Stime
        + ''' then SNAME else null end)[' + Stime + ']'
FROM    ( SELECT DISTINCT
                    Stime
          FROM      #B
        ) a
SET @sql = @sql
    + 'from #B join #A on #a.Id = Aid group by AId,#A.Name order by  AId'
EXEC(@sql)



真牛啊,不过,这个语句可以在.NET的查询语句中吗,这些定义变量啥的会丢失吗?
nippycn 2018-07-26
  • 打赏
  • 举报
回复
引用 2 楼 qq_42805993 的回复:
题中要求的结果做不到。 楼主想必是以学习为目的。 1.SQLserver环境下case纵转横,需行标题为表示分类的字段(例如:AName),而不是表示明细的字段。 2.access或Excel环境下,交叉查询transform后只可跟一个字段,而题中有两个。当然,也可以考虑先合再分。貌似还有其他难点,头有点痛,就不细想了。毕竟我只是来指个路,而题目的结果也不是最终目的。 百度关键字: SQL纵转横 VBA transform
SQL纵转横能不能实现下面的目的: ID AName 1996-10 1998-10 2000-08 2004-06 2008-09 2008-10 2011-05 2012-01 2017-03 2018-04 1 刘德华 我恨我痴心 冰雨 爱你一万年 2 张杰 这就是爱 逆战 三生三世 给女儿的一封信 3 林俊杰 江南 小酒窝 醉赤壁
nippycn 2018-07-26
  • 打赏
  • 举报
回复
SQL纵转横能不能实现下面的目的: ID AName 1996-10 1998-10 2000-08 2004-06 2008-09 2008-10 2011-05 2012-01 2017-03 2018-04 1 刘德华 我恨我痴心 冰雨 爱你一万年 2 张杰 这就是爱 逆战 三生三世 给女儿的一封信 3 林俊杰 江南 小酒窝 醉赤壁 ID AName SName1 stime1 SName2 stime2 SName3 stime3 SName4 stime4 1 刘德华 冰雨 1998-10 爱你一万年 2000-08 我恨我痴心 1996-10 2 张杰 三生三世 2017-03 这就是爱 2011-05 逆战 2012-01 给女儿的一封信 2018-05 3 林俊杰 小酒窝 2008-09 醉赤壁 2008-10 江南 2004-06
LikeStudyDR 2018-07-26
  • 打赏
  • 举报
回复
题中要求的结果做不到。
楼主想必是以学习为目的。
1.SQLserver环境下case纵转横,需行标题为表示分类的字段(例如:AName),而不是表示明细的字段。

2.access或Excel环境下,交叉查询transform后只可跟一个字段,而题中有两个。当然,也可以考虑先合再分。貌似还有其他难点,头有点痛,就不细想了。毕竟我只是来指个路,而题目的结果也不是最终目的。

百度关键字:
SQL纵转横
VBA transform
nippycn 2018-07-26
  • 打赏
  • 举报
回复
不好意思 表2中还有一个条件 表A中 ID name 1 刘德华 2 张杰 3 林俊杰 表B中 ID AID SNAME Stime 1 1 冰雨 1998-10 2 1 爱你一万年 2000-08 3 2 三生三世 2017-03 4 1 我恨我痴心 1996-10 5 2 这就是爱 2011-05 6 3 小酒窝 2008-09 7 2 逆战 2012-01 8 3 醉赤壁 2008-10 9 3 江南 2004-06 10 2 给女儿的一封信 2018-05 我现在想得到结果(后面的sName1-10字段根据实际增长到10个以内) ID AName SName1 stime1 SName2 stime2 SName3 stime3 SName4 stime4 1 刘德华 冰雨 1998-10 爱你一万年 2000-08 我恨我痴心 1996-10 2 张杰 三生三世 2017-03 这就是爱 2011-05 逆战 2012-01 给女儿的一封信 2018-05 3 林俊杰 小酒窝 2008-09 醉赤壁 2008-10 江南 2004-06 这个代码要如何写?求助中?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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