关于sql行转列 字符拼接,求指导该怎么写

qq_33555509 2017-03-30 10:54:45
表格内容如下,这只是其中一个id,还有很多,且每个id行数不固定


想要得到的效果


重点是动态啊... 求帮助
...全文
276 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-03-30
  • 打赏
  • 举报
回复
引用 6 楼 leo_lesley 的回复:
create table tab (id int , QueTitle nvarchar(100), QueAnswer nvarchar(100), OptionName nvarchar(100),Answer nvarchar(100)) go insert tab select 21195,N'单选',N'aa',N'B、测试2',N'测试' union select 21195,N'多选',N'aa',N'B、测试1',NULL union select 21195,N'多选',N'aa',N'B、测试3',N'测试adfadsf' union select 21195,N'填空',N'打的','','' union select 21195,N'问答',N'到达的哦啊恶化发俄方aef','','' union go select * from ( select id,QueTitle, aa = case when QueTitle not in ('单选','多选') then (select ' '+QueAnswer from tab where id = t.id and QueTitle = t.QueTitle for xml path('') ) else (select ' '+isnull(OptionName,'')+isnull(Answer,'') from tab where id = t.id and QueTitle = t.QueTitle for xml path('') ) end from tab t group by id,QueTitle ) x pivot(max(aa) for QueTitle in (单选,多选,填空,问答)) t
题目不是固定的,题目类型才固定,而且内容非常多,不能一个一个写到新表去吧...
leo_lesley 2017-03-30
  • 打赏
  • 举报
回复
create table tab (id int , QueTitle nvarchar(100), QueAnswer nvarchar(100), OptionName nvarchar(100),Answer nvarchar(100)) go insert tab select 21195,N'单选',N'aa',N'B、测试2',N'测试' union select 21195,N'多选',N'aa',N'B、测试1',NULL union select 21195,N'多选',N'aa',N'B、测试3',N'测试adfadsf' union select 21195,N'填空',N'打的','','' union select 21195,N'问答',N'到达的哦啊恶化发俄方aef','','' union go select * from ( select id,QueTitle, aa = case when QueTitle not in ('单选','多选') then (select ' '+QueAnswer from tab where id = t.id and QueTitle = t.QueTitle for xml path('') ) else (select ' '+isnull(OptionName,'')+isnull(Answer,'') from tab where id = t.id and QueTitle = t.QueTitle for xml path('') ) end from tab t group by id,QueTitle ) x pivot(max(aa) for QueTitle in (单选,多选,填空,问答)) t
「已注销」 2017-03-30
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
[quote=引用 2 楼 qq_33555509 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 一共这四种固定类型的题目吗?
嗯嗯 这个是我select 之后的字段 题目类型是这四种 需要把多选合成一个 然后按id行转列 这是我刚弄的[/quote] 用for xml path就能实现吧。 如果能贴点测试数据,可以写写试试,图片的数据不好弄。。。。[/quote] 21187 1 测试单选题 B、测试2测试 21195 1 测试单选题 B、测试2测试 21195 2 测试多选题 A、测试多1 21195 2 测试多选题 C、测试多3测试时哟弄 21195 3 测试填空题 打的 21195 4 测试问答题 多大的顶顶顶顶湿哒哒 21188 1 测试单选题 B、测试2大东方闪电 21188 2 测试多选题 B、测试多2 21188 2 测试多选题 C、测试多3阿斯顿发斯蒂芬 21198 1 测试单选题 B、测试2都很反感路口监控了 21198 2 测试多选题 B、测试多2 21198 2 测试多选题 C、测试多3就很快很快就会 21198 3 测试填空题 橘红颗粒很快就回家 21198 4 测试问答题 客户即可很快过 21192 1 测试单选题 B、测试212324564 21192 3 测试填空题 21166 1 测试单选题 B、测试2 21166 2 测试多选题 B、测试多2 21166 3 测试填空题 111 21166 4 测试问答题 224334343
「已注销」 2017-03-30
  • 打赏
  • 举报
回复
更新



需要行转列,并且把多选题合并,有一个字段标明题类型
二月十六 2017-03-30
  • 打赏
  • 举报
回复
引用 2 楼 qq_33555509 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 一共这四种固定类型的题目吗?
嗯嗯 这个是我select 之后的字段 题目类型是这四种 需要把多选合成一个 然后按id行转列 这是我刚弄的[/quote] 用for xml path就能实现吧。 如果能贴点测试数据,可以写写试试,图片的数据不好弄。。。。
「已注销」 2017-03-30
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
一共这四种固定类型的题目吗?

嗯嗯 这个是我select 之后的字段 题目类型是这四种 需要把多选合成一个 然后按id行转列

这是我刚弄的
二月十六 2017-03-30
  • 打赏
  • 举报
回复
一共这四种固定类型的题目吗?
「已注销」 2017-03-30
  • 打赏
  • 举报
回复
引用 12 楼 sinat_28984567 的回复:
是按id分组的,不知道是不是一个id代表一个题目,如果是语句就没问题,如果不是。那就得再改改了。
问了主管,结果主管让改数据库把多选放到一行了... 剩下单纯的行转列就好弄了 多谢!
二月十六 2017-03-30
  • 打赏
  • 举报
回复
是按id分组的,不知道是不是一个id代表一个题目,如果是语句就没问题,如果不是。那就得再改改了。
「已注销」 2017-03-30
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([Id] int,[QueType] int,[QueTitle] nvarchar(25),[Answer] nvarchar(34))
Insert #T
select 21187,1,N'测试单选题',N'B、测试2测试' union all
select 21195,1,N'测试单选题',N'B、测试2测试' union all
select 21195,2,N'测试多选题',N'A、测试多1' union all
select 21195,2,N'测试多选题',N'C、测试多3测试时哟弄' union all
select 21195,3,N'测试填空题',N'打的' union all
select 21195,4,N'测试问答题',N'多大的顶顶顶顶湿哒哒' union all
select 21188,1,N'测试单选题',N'B、测试2大东方闪电' union all
select 21188,2,N'测试多选题',N'B、测试多2' union all
select 21188,2,N'测试多选题',N'C、测试多3阿斯顿发斯蒂芬' union all
select 21198,1,N'测试单选题',N'B、测试2都很反感路口监控了' union all
select 21198,2,N'测试多选题',N'B、测试多2' union all
select 21198,2,N'测试多选题',N'C、测试多3就很快很快就会' union all
select 21198,3,N'测试填空题',N'橘红颗粒很快就回家' union all
select 21198,4,N'测试问答题',N'客户即可很快过' union all
select 21192,1,N'测试单选题',N'B、测试212324564' union all
select 21192,3,N'测试填空题',null union all
select 21166,1,N'测试单选题',N'B、测试2' union all
select 21166,2,N'测试多选题',N'B、测试多2' union all
select 21166,3,N'测试填空题',N'111' union all
select 21166,4,N'测试问答题',N'224334343'
Go
--测试数据结束


--结果集可以这样使用,下边直接用就行
;WITH 你的结果集 AS (
SELECT * FROM #T
)
SELECT  a.ID ,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 1
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试单选题,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 2
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试多选题,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 3
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试填空题,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 4
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试问答题
FROM    你的结果集 a
GROUP BY a.Id
ORDER BY a.Id
题目数量是不固定的 也就是可能做多个单选,这个好像把所有单选放到一个结果里了,希望能按题目分开啊...
二月十六 2017-03-30
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([Id] int,[QueType] int,[QueTitle] nvarchar(25),[Answer] nvarchar(34))
Insert #T
select 21187,1,N'测试单选题',N'B、测试2测试' union all
select 21195,1,N'测试单选题',N'B、测试2测试' union all
select 21195,2,N'测试多选题',N'A、测试多1' union all
select 21195,2,N'测试多选题',N'C、测试多3测试时哟弄' union all
select 21195,3,N'测试填空题',N'打的' union all
select 21195,4,N'测试问答题',N'多大的顶顶顶顶湿哒哒' union all
select 21188,1,N'测试单选题',N'B、测试2大东方闪电' union all
select 21188,2,N'测试多选题',N'B、测试多2' union all
select 21188,2,N'测试多选题',N'C、测试多3阿斯顿发斯蒂芬' union all
select 21198,1,N'测试单选题',N'B、测试2都很反感路口监控了' union all
select 21198,2,N'测试多选题',N'B、测试多2' union all
select 21198,2,N'测试多选题',N'C、测试多3就很快很快就会' union all
select 21198,3,N'测试填空题',N'橘红颗粒很快就回家' union all
select 21198,4,N'测试问答题',N'客户即可很快过' union all
select 21192,1,N'测试单选题',N'B、测试212324564' union all
select 21192,3,N'测试填空题',null union all
select 21166,1,N'测试单选题',N'B、测试2' union all
select 21166,2,N'测试多选题',N'B、测试多2' union all
select 21166,3,N'测试填空题',N'111' union all
select 21166,4,N'测试问答题',N'224334343'
Go
--测试数据结束


--结果集可以这样使用,下边直接用就行
;WITH 你的结果集 AS (
SELECT * FROM #T
)
SELECT  a.ID ,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 1
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试单选题,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 2
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试多选题,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 3
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试填空题,
        STUFF(( SELECT  ',' + Answer
                FROM    你的结果集 b
                WHERE   a.id = b.Id
                        AND b.QueType = 4
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试问答题
FROM    你的结果集 a
GROUP BY a.Id
ORDER BY a.Id
「已注销」 2017-03-30
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
语句:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([Id] int,[QueType] int,[QueTitle] nvarchar(25),[Answer] nvarchar(34))
Insert #T
select 21187,1,N'测试单选题',N'B、测试2测试' union all
select 21195,1,N'测试单选题',N'B、测试2测试' union all
select 21195,2,N'测试多选题',N'A、测试多1' union all
select 21195,2,N'测试多选题',N'C、测试多3测试时哟弄' union all
select 21195,3,N'测试填空题',N'打的' union all
select 21195,4,N'测试问答题',N'多大的顶顶顶顶湿哒哒' union all
select 21188,1,N'测试单选题',N'B、测试2大东方闪电' union all
select 21188,2,N'测试多选题',N'B、测试多2' union all
select 21188,2,N'测试多选题',N'C、测试多3阿斯顿发斯蒂芬' union all
select 21198,1,N'测试单选题',N'B、测试2都很反感路口监控了' union all
select 21198,2,N'测试多选题',N'B、测试多2' union all
select 21198,2,N'测试多选题',N'C、测试多3就很快很快就会' union all
select 21198,3,N'测试填空题',N'橘红颗粒很快就回家' union all
select 21198,4,N'测试问答题',N'客户即可很快过' union all
select 21192,1,N'测试单选题',N'B、测试212324564' union all
select 21192,3,N'测试填空题',null union all
select 21166,1,N'测试单选题',N'B、测试2' union all
select 21166,2,N'测试多选题',N'B、测试多2' union all
select 21166,3,N'测试填空题',N'111' union all
select 21166,4,N'测试问答题',N'224334343'
Go
--测试数据结束
SELECT  a.ID ,
        STUFF(( SELECT  ',' + Answer
                FROM    #T b
                WHERE   a.id = b.Id
                        AND b.QueType = 1
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试单选题,
        STUFF(( SELECT  ',' + Answer
                FROM    #T b
                WHERE   a.id = b.Id
                        AND b.QueType = 2
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试多选题,
        STUFF(( SELECT  ',' + Answer
                FROM    #T b
                WHERE   a.id = b.Id
                        AND b.QueType = 3
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试填空题,
        STUFF(( SELECT  ',' + Answer
                FROM    #T b
                WHERE   a.id = b.Id
                        AND b.QueType = 4
              FOR
                XML PATH('')
              ), 1, 1, '') AS 测试问答题
FROM    #T a
GROUP BY a.Id
ORDER BY a.Id
我给的数据是结果集,直接把结果集套上去好像不太对...
select * from(
select Id,QueType,QueTitle,(case when OptionId IS not null then isnull(OptionName,'')+isnull(OptionAnswer,'') else QueAnswer end)as answer from CALL_DAIL_PHONE_ITEM where QueType != 5) a
这是sql... 我要把结果弄到一张表里再用你的sql么
二月十六 2017-03-30
  • 打赏
  • 举报
回复
语句:
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([Id] int,[QueType] int,[QueTitle] nvarchar(25),[Answer] nvarchar(34))
Insert #T
select 21187,1,N'测试单选题',N'B、测试2测试' union all
select 21195,1,N'测试单选题',N'B、测试2测试' union all
select 21195,2,N'测试多选题',N'A、测试多1' union all
select 21195,2,N'测试多选题',N'C、测试多3测试时哟弄' union all
select 21195,3,N'测试填空题',N'打的' union all
select 21195,4,N'测试问答题',N'多大的顶顶顶顶湿哒哒' union all
select 21188,1,N'测试单选题',N'B、测试2大东方闪电' union all
select 21188,2,N'测试多选题',N'B、测试多2' union all
select 21188,2,N'测试多选题',N'C、测试多3阿斯顿发斯蒂芬' union all
select 21198,1,N'测试单选题',N'B、测试2都很反感路口监控了' union all
select 21198,2,N'测试多选题',N'B、测试多2' union all
select 21198,2,N'测试多选题',N'C、测试多3就很快很快就会' union all
select 21198,3,N'测试填空题',N'橘红颗粒很快就回家' union all
select 21198,4,N'测试问答题',N'客户即可很快过' union all
select 21192,1,N'测试单选题',N'B、测试212324564' union all
select 21192,3,N'测试填空题',null union all
select 21166,1,N'测试单选题',N'B、测试2' union all
select 21166,2,N'测试多选题',N'B、测试多2' union all
select 21166,3,N'测试填空题',N'111' union all
select 21166,4,N'测试问答题',N'224334343'
Go
--测试数据结束
SELECT a.ID ,
STUFF(( SELECT ',' + Answer
FROM #T b
WHERE a.id = b.Id
AND b.QueType = 1
FOR
XML PATH('')
), 1, 1, '') AS 测试单选题,
STUFF(( SELECT ',' + Answer
FROM #T b
WHERE a.id = b.Id
AND b.QueType = 2
FOR
XML PATH('')
), 1, 1, '') AS 测试多选题,
STUFF(( SELECT ',' + Answer
FROM #T b
WHERE a.id = b.Id
AND b.QueType = 3
FOR
XML PATH('')
), 1, 1, '') AS 测试填空题,
STUFF(( SELECT ',' + Answer
FROM #T b
WHERE a.id = b.Id
AND b.QueType = 4
FOR
XML PATH('')
), 1, 1, '') AS 测试问答题
FROM #T a
GROUP BY a.Id
ORDER BY a.Id





22,302

社区成员

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

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