这种转置怎么写。

ah_2056 2013-08-26 10:27:19
原来的表结构如下:
字段二 字段三
值1 批文1
值2 批文1
值3 批文1
值4 批文1
值5 批文1
值6 批文1
值7 批文1
值8 批文2
值9 批文2
值10 批文2
值11 批文2
值12 批文3
值13 批文3


转换的如下:

字段三 字段二
批文1 值1 , 值2, 值3, 值4, 值5, 值6, 值7
批文2 值8,值9
批文3 值10,值11,值12,值13
...全文
188 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2013-08-26
  • 打赏
  • 举报
回复
if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
go
create table #temp( [字段二] varchar(100), [字段三] varchar(100));
insert #temp
select '值1','批文1' union all
select '值2','批文1' union all
select '值3','批文1' union all
select '值4','批文1' union all
select '值5','批文1' union all
select '值6','批文1' union all
select '值7','批文1' union all
select '值8','批文2' union all
select '值9','批文2' union all
select '值10','批文2' union all
select '值11','批文2' union all
select '值12','批文3' union all
select '值13','批文3' 

--SQL
DECLARE @sql NVARCHAR(MAX), @colList NVARCHAR(MAX)
SET @colList = STUFF((select DISTINCT ','+QUOTENAME(ROW_NUMBER() OVER(PARTITION BY 字段三 ORDER BY GETDATE())) from #temp FOR XML PATH('')),1,1,'')
SET @sql = N'
    select * from 
	(select rowid=ROW_NUMBER() OVER(PARTITION BY 字段三 ORDER BY GETDATE()), 字段二, 字段三 from #temp) a
    pivot
    (max(字段二) for rowid in('+ @colList +')) b
'
EXEC(@sql)

/*
字段三	1	2	3	4	5	6	7
批文1	值1	值2	值3	值4	值5	值6	值7
批文2	值8	值9	值10	值11	NULL	NULL	NULL
批文3	值12	值13	NULL	NULL	NULL	NULL	NULL
*/
KeepSayingNo 2013-08-26
  • 打赏
  • 举报
回复
SELECT A.[字段三], name = STUFF(
(SELECT ','+[字段二] FROM [Table_3] B 
WHERE B.[字段三]=A.[字段三] ORDER BY [字段二] DESC FOR XML PATH('')),1,1,'')
FROM [Table_3] A GROUP BY [字段三]  
请将表名换为你的表名即可
IEEE_China 2013-08-26
  • 打赏
  • 举报
回复
如果还有问题,你用中文表达。
ah_2056 2013-08-26
  • 打赏
  • 举报
回复
anymore?
IEEE_China 2013-08-26
  • 打赏
  • 举报
回复

if object_id('Tempdb..#a') is not null drop table #a 
 
create table #a([字段二] nvarchar(100) null, [字段三] nvarchar(100) null)   
 

Insert Into #a 
select '值1','批文1' union all
select '值2','批文1' union all
select '值3','批文1' union all
select '值4','批文1' union all
select '值5','批文1' union all
select '值6','批文1' union all
select '值7','批文1' union all
select '值8','批文2' union all
select '值9','批文2' union all
select '值10','批文2' union all
select '值11','批文2' union all
select '值12','批文3' union all
select '值13','批文3'
   
 
select t.字段三,
stuff((select  ','+字段二  from #a z where t.字段三=z.字段三 for xml path('')), 1, 1, '') '字段二'  
from #a t  
group by t.字段三

-------------

(13 行受影响)
字段三                                                                                                  字段二
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
批文1                                                                                                  值1,值2,值3,值4,值5,值6,值7
批文2                                                                                                  值8,值9,值10,值11
批文3                                                                                                  值12,值13

(3 行受影响)


IEEE_China 2013-08-26
  • 打赏
  • 举报
回复
sql语句用了 汇总函数,就需要group by 。 group by 作用是将数据依据条件分组,并且在select语句中使用汇总函数进行汇总。 详情请通过网络查询,查阅msdn或有关sql书籍。
ah_2056 2013-08-26
  • 打赏
  • 举报
回复
引用 3 楼 Imaor 的回复:
如果还有问题,你用中文表达。
不好意思,有点看不懂最后一句话,group by t.字段三为什么不加就出不来。
haitao 2013-08-26
  • 打赏
  • 举报
回复
这个需求,如果有 字符串的sum函数,就很简单了

27,579

社区成员

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

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