SQL 2005列转行的疑难问题

默默唐 2013-09-10 12:42:25
例如: 编号
001
002
003
004
005
006
007
008

查询得出结果显示如下:
编号1 编号2 编号3
001 004 007
002 005 008
003 006 NULL

也就是隔3行换一次列


declare @tb table([col] varchar(3))
insert @tb
select '001' union all
select '002' union all
select '003' union all
select '004' union all
select '005' union all
select '006' union all
select '007' union all
select '008''

;WITH TEMP AS
(
SELECT *,ROW_NUMBER() OVER(ORDER BY getdate()) AS RID
FROM @tb
)
SELECT
col1=max(case when RID%3=1 then col end),
col2=max(case when RID%3=2 then col end),
col3=max(case when RID%3=0 then col end)
FROM TEMP
GROUP BY (RID-1)/3

得出的结果是:
编号1 编号2 编号3
001 002 003
004 005 006
007 008 NULL

搞不定,求助各位大神~~~
...全文
95 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
默默唐 2013-09-10
  • 打赏
  • 举报
回复
谢谢楼上两位高手的精彩解答,都可以解决问题。相对来讲,hdhai9451大大的更易懂一些。版主大大的也不错。
--小F-- 2013-09-10
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2013-09-10 14:22:21
-- Verstion:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86) 
--	Apr  2 2010 15:53:02 
--	Copyright (c) Microsoft Corporation
--	Data Center Edition on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (WOW64)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([编号] varchar(3))
insert [tb]
select '001' union all
select '002' union all
select '003' union all
select '004' union all
select '005' union all
select '006' union all
select '007' union all
select '008'
--------------开始查询--------------------------
;WITH F AS
(
SELECT *,ID=ROW_NUMBER()OVER(ORDER BY GETDATE()) FROM tb
)

SELECT 
  A.编号 AS 编号1,B.编号 AS 编号2,C.编号 AS 编号3
FROM
  (SELECT * FROM F WHERE ((ID - 1) / 3) % 3 = 0) A
LEFT JOIN
  (SELECT * FROM F WHERE ((ID - 1) / 3) % 3 = 1) B
ON
  (A.ID-1)/3=(B.ID-1)/3-1
AND
  (A.ID-1)%3=(B.ID-1)%3
LEFT JOIN
  (SELECT * FROM F WHERE ((ID - 1) / 3) % 3 = 2) C
ON
  (B.ID-1)/3=(C.ID-1)/3-1
AND
  (B.ID-1)%3=(C.ID-1)%3
----------------结果----------------------------
/*编号1  编号2  编号3
---- ---- ----
001  004  007
002  005  008
003  006  NULL

(3 行受影响)



*/
Andy__Huang 2013-09-10
  • 打赏
  • 举报
回复
declare @tb table([col] varchar(3))
insert @tb
select '001' union all
select '002' union all
select '003' union all
select '004' union all
select '005' union all
select '006' union all
select '007' union all
select '008'

;WITH temp AS
(
SELECT *,ROW_NUMBER() OVER(ORDER BY getdate()) AS RID
FROM @tb
),
t1 as
(
select top 3 *,ROW_NUMBER() OVER(ORDER BY getdate()) AS rn from temp 
),
t2 as
(
select top 3 *,ROW_NUMBER() OVER(ORDER BY getdate()) AS rn from temp where RID>(select MAX(RID) from t1)
),
t3 as
(
select top 3 *,ROW_NUMBER() OVER(ORDER BY getdate()) AS rn from temp where RID>(select MAX(RID) from t2)
)
select t1.col as 编号1,t2.col as 编号2,t3.col as 编号3 
from t1
left join t2 on t1.rn=t2.rn
left join t3 on t1.rn=t3.rn

/*
编号1	编号2	编号3
001	004	007
002	005	008
003	006	NULL
*/
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

22,209

社区成员

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

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