求助sqlserver 列转行

mailforprint 2014-10-15 12:11:05
请问下怎么快速将下面表格从【模式1】转成【模式2】

模式1:
区域 耗时 达标率 数量
城区 1 90% 1
东区 2 80% 2
南区 3 100% 6
西区 4 10% 22

模式2:
类型 城区 东区 南区 西区
耗时 1 2 3 4
达标率 90% 80% 100% 10%
数量 1 2 6 22
...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaodongni 2014-10-15
  • 打赏
  • 举报
回复
这个在后台不好实现。你没列的数据类型都不一样。必须都转换成varchar()才可以。 非要在后台实现就这样。

with cte as 
(select '城区' as 区域,1 as 耗时, '90%' as 达标率,1 as 数量 union all 
 select '东区' as 区域,2 as 耗时, '80%' as 达标率,2 as 数量 union all 
 select '南区' as 区域,3 as 耗时, '100%' as 达标率,6 as 数量 union all 
 select '西区' as 区域,4 as 耗时, '10%' as 达标率,22 as 数量 )
 select '耗时' as 类型,* from 
 (select 区域,convert(varchar(5),耗时) as 耗时 from  cte) as t
 pivot (max(耗时) for 区域 in([城区],[东区],[南区],[西区])) as p
 union all
  select '达标率',* from 
 (select 区域,达标率 from  cte) as t
 pivot (max(达标率) for 区域 in([城区],[东区],[南区],[西区])) as p
 union all
   select '数量',* from 
 (select 区域,convert(varchar(5),数量) as 数量 from  cte) as t
 pivot (max(数量) for 区域 in([城区],[东区],[南区],[西区])) as p
 
--结果
类型     城区    东区    南区    西区
------ ----- ----- ----- -----
耗时     1     2     3     4
达标率    90%   80%   100%  10%
数量     1     2     6     22

还在加载中灬 2014-10-15
  • 打赏
  • 举报
回复
是应用于程序中吗? 在程序中, 改 一行一行读数据 为 一列一列读~~
mailforprint 2014-10-15
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
WITH test(区域,耗时,达标率,数量) AS (
    -- 数据必须一致,统一为 char(4)
    SELECT N'城区','   1',' 90%','   1' UNION ALL
    SELECT N'东区','   2',' 80%','   2' UNION ALL
    SELECT N'南区','   3','100%','   6' UNION ALL
    SELECT N'西区','   4',' 10%','  22'
),
-- 先拆分单元
cells AS (
    SELECT 区域,类型,value
      FROM test
   UNPIVOT (value FOR 类型 IN (耗时,达标率,数量)
           ) u
)
-- 再组合
SELECT *
  FROM cells
 PIVOT (MAX(value) FOR 区域 IN ([城区],[东区],[南区],[西区])
       ) p
ORDER BY CASE 类型 WHEN '耗时'   THEN 1
                   WHEN '达标率' THEN 2
                   WHEN '数量'   THEN 3
         END
类型        城区 东区 南区 西区
----------- ---- ---- ---- ----
耗时           1    2    3    4
达标率       90%  80% 100%  10%
数量           1    2    6   22
这个方式不错,我之前只想到单独用pivot,然后union all
KeepSayingNo 2014-10-15
  • 打赏
  • 举报
回复
其它两个都像下面处理,然后把三个结果集union即可

SELECT '耗时' as [类型],[城区],[东区],[南区],[西区]
FROM [表名]  
pivot  
(  
  sum([耗时]) for [区域] in ([城区],[东区],[南区],[西区])  
) as pvt  
Tiger_Zhao 2014-10-15
  • 打赏
  • 举报
回复
WITH test(区域,耗时,达标率,数量) AS (
-- 数据必须一致,统一为 char(4)
SELECT N'城区',' 1',' 90%',' 1' UNION ALL
SELECT N'东区',' 2',' 80%',' 2' UNION ALL
SELECT N'南区',' 3','100%',' 6' UNION ALL
SELECT N'西区',' 4',' 10%',' 22'
),
-- 先拆分单元
cells AS (
SELECT 区域,类型,value
FROM test
UNPIVOT (value FOR 类型 IN (耗时,达标率,数量)
) u
)
-- 再组合
SELECT *
FROM cells
PIVOT (MAX(value) FOR 区域 IN ([城区],[东区],[南区],[西区])
) p
ORDER BY CASE 类型 WHEN '耗时' THEN 1
WHEN '达标率' THEN 2
WHEN '数量' THEN 3
END

类型        城区 东区 南区 西区
----------- ---- ---- ---- ----
耗时 1 2 3 4
达标率 90% 80% 100% 10%
数量 1 2 6 22

22,209

社区成员

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

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