sqlserver查询结果行列转换问题

pwdu1981 2017-12-26 03:28:52
最近遇到类似如下一个需求,数据库表数据如下
F_Month F_MonthTarget F_UsedValue F_MonthRate
1月 156003.00 189870 56
2月 166489.00 345678 80
3月 129827.00 345690 37
。。。。。
要求将查询结果行列完全互换过来,如下所示
1月 2月 3月
156003.00 166489.00 129827.00
189870 345678 345690
56 80 37

使用PIVOT试了好久但是一直没得到想要的结果,麻烦各位大大帮忙看下吧,谢谢!谢谢!
...全文
472 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
pwdu1981 2017-12-26
  • 打赏
  • 举报
回复
谢谢 @qq_37170555 听雨停了 大神 ,膜拜,谢谢!
听雨停了 2017-12-26
  • 打赏
  • 举报
回复

-> --> 听雨停了-->生成测试数据

if not object_id(N'tab') is null
drop table tab
Go
Create table tab([F_Month] nvarchar(22),[F_MonthTarget] decimal(18,8),[F_UsedValue] int,[F_MonthRate] int)
Insert tab
select N'1月',156003.00,189870,56 union all
select N'2月',166489.00,345678,80 union all
select N'3月',129827.00,345690,37
GO
--测试数据结束

--1.表数据转换类型插入另一个表tab_cast
Select cast(f_month AS VARCHAR(200)) AS f_month,
cast([F_MonthTarget] AS VARCHAR(200)) AS [F_MonthTarget],
cast([F_UsedValue] AS VARCHAR(200)) AS [F_UsedValue],
cast([F_UsedValue] AS VARCHAR(200)) AS [F_MonthRate]
INTO tab_cast
from tab

--2.先列转行插入另一个表tab_unpivot
declare @sql varchar(max)
select @sql=isnull(@sql+',','')+cast(quotename(Name) AS VARCHAR(100))
from syscolumns
where ID=object_id('tab_cast')and Name not in('f_month')
order by Colid
set @sql='select f_month,[title],[cnt] into tab_unpivot from tab_cast unpivot ([cnt] for [title] in('+@sql+'))b'
exec(@sql)

--3.行转列显示得到结果
DECLARE @name VARCHAR(max),@psql VARCHAR(max)
set @name =stuff((SELECT DISTINCT ',['+[f_month]+']' from tab_unpivot for xml PATH('')),1,1,'')
set @psql ='SELECT * from tab_unpivot pivot(max(cnt)for f_month in('+@name+'))a'
EXEC( @psql)

--4.删除表
DROP TABLE tab_cast
DROP TABLE tab_unpivot


34,590

社区成员

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

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