sql行转列的问题,求大神,在线等!

lilong307485155 2015-08-03 12:06:42
数据表解构,数据是:
id name reason
1 张三 不好用
2 李四 不需要
3 张三 有其他软件
4 张三 不好用

查询name为张三的结果,转换成列,下面是希望得到的结果是
id name reason1 reason2 reason3
1 张三 不好用 有其他软件 不好用
...全文
205 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Landa_Tiny_cui 2015-08-04
  • 打赏
  • 举报
回复
如果是reason是确定的数量,可以像二楼写成sum case when 的方式,不确定的话只能用动态SQL。 至少在我现在的水平是这样理解的
lli100 2015-08-04
  • 打赏
  • 举报
回复
引用 11 楼 Landa_Tiny_cui 的回复:
是因为你的REASON不固定才写成动态SQL的,不用动态写 我还真不会
这样是否可以写呢,不管怎样你的回复是最满意的,你看看会不会,然后回复一下了我给分!
lli100 2015-08-04
  • 打赏
  • 举报
回复
引用 11 楼 Landa_Tiny_cui 的回复:
是因为你的REASON不固定才写成动态SQL的,不用动态写 我还真不会
如果给定了REASON最多只有6条呢?
  • 打赏
  • 举报
回复
前排占一个沙发先
xiaoxiangqing 2015-08-03
  • 打赏
  • 举报
回复
只能用动态语句才可以
Landa_Tiny_cui 2015-08-03
  • 打赏
  • 举报
回复
是因为你的REASON不固定才写成动态SQL的,不用动态写 我还真不会
lilong307485155 2015-08-03
  • 打赏
  • 举报
回复
引用 9 楼 Landa_Tiny_cui 的回复:
OK,明白了,是这个意思吧 你看看效果对吗?

create table tb(ID int,NAME varchar(10) , reason varchar(10))
insert into tb values('1','张三' , '不好用')
insert into tb values('2','李四' , '不需要')
insert into tb values('3','张三' , '有其他软件')
insert into tb values('6','张三' , '死了' )
insert into tb values('8','张三' , '活着' )
insert into tb values('11','张三' , '不好玩' )
insert into tb values('13','张三' , '真没劲' )
insert into tb values('18','张三' , '好简单' )
insert into tb values('22','张三' , '不爱答' )


DECLARE @s NVARCHAR(max)
SET @s='SELECT NAME' 
SELECT @S=@S+
		','+'MAX( CASE WHEN ID='+QUOTENAME(ID,N'''')+' THEN REASON END) AS REANSON'+CONVERT(VARCHAR,ROW_NUMBER()over(ORDER BY id))
FROM tb
WHERE NAME='张三' 
GROUP BY ID
--PRINT (@S)
SET @S=@S+' FROM TB where name=''张三'' GROUP BY NAME'
--PRINT(@S)
EXEC(@S)
NAME REANSON1 REANSON2 REANSON3 REANSON4 REANSON5 REANSON6 REANSON7 REANSON8 REANSON9 ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 张三 不好用 有其他软件 不好用 死了 活着 不好玩 真没劲 好简单 不爱答
大神,能转换成纯sql语句吗?
Landa_Tiny_cui 2015-08-03
  • 打赏
  • 举报
回复
OK,明白了,是这个意思吧 你看看效果对吗?

create table tb(ID int,NAME varchar(10) , reason varchar(10))
insert into tb values('1','张三' , '不好用')
insert into tb values('2','李四' , '不需要')
insert into tb values('3','张三' , '有其他软件')
insert into tb values('6','张三' , '死了' )
insert into tb values('8','张三' , '活着' )
insert into tb values('11','张三' , '不好玩' )
insert into tb values('13','张三' , '真没劲' )
insert into tb values('18','张三' , '好简单' )
insert into tb values('22','张三' , '不爱答' )


DECLARE @s NVARCHAR(max)
SET @s='SELECT NAME' 
SELECT @S=@S+
		','+'MAX( CASE WHEN ID='+QUOTENAME(ID,N'''')+' THEN REASON END) AS REANSON'+CONVERT(VARCHAR,ROW_NUMBER()over(ORDER BY id))
FROM tb
WHERE NAME='张三' 
GROUP BY ID
--PRINT (@S)
SET @S=@S+' FROM TB where name=''张三'' GROUP BY NAME'
--PRINT(@S)
EXEC(@S)
NAME REANSON1 REANSON2 REANSON3 REANSON4 REANSON5 REANSON6 REANSON7 REANSON8 REANSON9 ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 张三 不好用 有其他软件 不好用 死了 活着 不好玩 真没劲 好简单 不爱答
lilong307485155 2015-08-03
  • 打赏
  • 举报
回复
引用 7 楼 happy0021 的回复:
[quote=引用 6 楼 Landa_Tiny_cui 的回复:] 效果还不是很好,我不明白你的ID到底是什么

create table tb(ID int,NAME varchar(10) , reason varchar(10))
insert into tb values('1','张三' , '不好用')
insert into tb values('2','李四' , '不需要')
insert into tb values('3','张三' , '有其他软件')
insert into tb values('4','张三' , '不好用' )




DECLARE @s NVARCHAR(max)
SET @s='SELECT NAME' 
SELECT @S=@S+
		','+'MAX( CASE WHEN ID='+QUOTENAME(ID,N'''')+' THEN REASON END) AS REANSON'+CONVERT(VARCHAR,ID)
FROM tb 
GROUP BY ID
--PRINT (@S)
SET @S=@S+' FROM TB GROUP BY NAME'
--PRINT(@S)
EXEC(@S)
所以需要楼主表述清晰一点,多给一点数据,做个数据表
 --测试用
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb([ID] [int] IDENTITY(1,1) NOT NULL,,NAME varchar(10) , reason varchar(10))
insert into #tb values('张三' , '不好用')
insert into #tb values('李四' , '不需要')
insert into #tb values('张三' , '有其他软件')
insert into #tb values('张三' , '不好用' )
。。。
。。。。多给一点数据,做个数据表

go

[/quote] ID是数据库自增列(有可能插入第5条数据的时候ID是8了,因为前面2条数据插入错误了),需求很清楚明白哦。 查询name为张三的结果,转换成列,下面是希望得到的结果是 id name reason1 reason2 reason3 1 张三 不好用 有其他软件 不好用 而且reason1~多少是不定的,有可能是10条,有可能是一条
happy0021 2015-08-03
  • 打赏
  • 举报
回复
引用 6 楼 Landa_Tiny_cui 的回复:
效果还不是很好,我不明白你的ID到底是什么

create table tb(ID int,NAME varchar(10) , reason varchar(10))
insert into tb values('1','张三' , '不好用')
insert into tb values('2','李四' , '不需要')
insert into tb values('3','张三' , '有其他软件')
insert into tb values('4','张三' , '不好用' )




DECLARE @s NVARCHAR(max)
SET @s='SELECT NAME' 
SELECT @S=@S+
		','+'MAX( CASE WHEN ID='+QUOTENAME(ID,N'''')+' THEN REASON END) AS REANSON'+CONVERT(VARCHAR,ID)
FROM tb 
GROUP BY ID
--PRINT (@S)
SET @S=@S+' FROM TB GROUP BY NAME'
--PRINT(@S)
EXEC(@S)
所以需要楼主表述清晰一点,多给一点数据,做个数据表
 --测试用
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb([ID] [int] IDENTITY(1,1) NOT NULL,,NAME varchar(10) , reason varchar(10))
insert into #tb values('张三' , '不好用')
insert into #tb values('李四' , '不需要')
insert into #tb values('张三' , '有其他软件')
insert into #tb values('张三' , '不好用' )
。。。
。。。。多给一点数据,做个数据表

go

Landa_Tiny_cui 2015-08-03
  • 打赏
  • 举报
回复
效果还不是很好,我不明白你的ID到底是什么

create table tb(ID int,NAME varchar(10) , reason varchar(10))
insert into tb values('1','张三' , '不好用')
insert into tb values('2','李四' , '不需要')
insert into tb values('3','张三' , '有其他软件')
insert into tb values('4','张三' , '不好用' )




DECLARE @s NVARCHAR(max)
SET @s='SELECT NAME' 
SELECT @S=@S+
		','+'MAX( CASE WHEN ID='+QUOTENAME(ID,N'''')+' THEN REASON END) AS REANSON'+CONVERT(VARCHAR,ID)
FROM tb 
GROUP BY ID
--PRINT (@S)
SET @S=@S+' FROM TB GROUP BY NAME'
--PRINT(@S)
EXEC(@S)
lilong307485155 2015-08-03
  • 打赏
  • 举报
回复
引用 2 楼 happy0021 的回复:
试试这个,抛砖引玉,需要琢磨
 
 --测试用
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb(ID int,NAME varchar(10) , reason varchar(10))
insert into #tb values('1','张三' , '不好用')
insert into #tb values('2','李四' , '不需要')
insert into #tb values('3','张三' , '有其他软件')
insert into #tb values('4','张三' , '不好用' )
go

select ID, name, reason , 
sum(case when ID=1 then 1 end) as reason1,
sum(case when ID=2 then 2 end) as reason2,
sum(case when ID=3 then 3 end) as reason3,
sum(case when ID=4 then 4 end) as reason4
from #tb 
where NAME='张三'
group by ID, name, reason
ORDER BY ID
这样不行,因为sum(case when ID=1 then 1 end) as reason1,这个id=1是什么意思呢?ID是数据库自增的列,有可能不是1,是2,不能这样写。
happy0021 2015-08-03
  • 打赏
  • 举报
回复
给多一点数据
 --测试用
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb(ID int,NAME varchar(10) , reason varchar(10))
insert into #tb values('1','张三' , '不好用')
insert into #tb values('2','李四' , '不需要')
insert into #tb values('3','张三' , '有其他软件')
insert into #tb values('4','张三' , '不好用' )
。。。
。。。。

go

  • 打赏
  • 举报
回复
引用 2 楼 happy0021 的回复:
试试这个,抛砖引玉,需要琢磨
 
 --测试用
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb(ID int,NAME varchar(10) , reason varchar(10))
insert into #tb values('1','张三' , '不好用')
insert into #tb values('2','李四' , '不需要')
insert into #tb values('3','张三' , '有其他软件')
insert into #tb values('4','张三' , '不好用' )
go

select ID, name, reason , 
sum(case when ID=1 then 1 end) as reason1,
sum(case when ID=2 then 2 end) as reason2,
sum(case when ID=3 then 3 end) as reason3,
sum(case when ID=4 then 4 end) as reason4
from #tb 
where NAME='张三'
group by ID, name, reason
ORDER BY ID
你这个name直接=张三还不简单,如果要同时出很多人的,就不行了,而且他reason1~多少是不定的,有可能是10条,有可能是一条
happy0021 2015-08-03
  • 打赏
  • 举报
回复
试试这个,抛砖引玉,需要琢磨
 
 --测试用
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb(ID int,NAME varchar(10) , reason varchar(10))
insert into #tb values('1','张三' , '不好用')
insert into #tb values('2','李四' , '不需要')
insert into #tb values('3','张三' , '有其他软件')
insert into #tb values('4','张三' , '不好用' )
go

select ID, name, reason , 
sum(case when ID=1 then 1 end) as reason1,
sum(case when ID=2 then 2 end) as reason2,
sum(case when ID=3 then 3 end) as reason3,
sum(case when ID=4 then 4 end) as reason4
from #tb 
where NAME='张三'
group by ID, name, reason
ORDER BY ID

34,590

社区成员

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

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