求☆☆邹建☆☆详解这段代码,呵呵。确实好用,但是就是不明白。
--table1 --任务编码 --任务编码主键
--table2 --任务编码,人员编码 --没有主键,每个任务有不同的人员参与,级别不同,数量不定
--table3 --人员编码,人员类型 ,姓名 --0,1,2,3,4四个类型
declare @t1 table(任务编码 varchar(20),车辆编码 varchar(10))
insert into @t1 select '001 ', '001 '
union all select '002 ', '002 '
declare @t2 table(任务编码 varchar(20),人员编码 varchar(10))
insert into @t2 select '001 ', '00001 '
union all select '001 ', '00003 '
union all select '001 ', '00005 '
union all select '001 ', '00007 '
union all select '001 ', '00009 '
union all select '001 ', '00010 '
union all select '002 ', '00002 '
union all select '002 ', '00004 '
union all select '002 ', '00006 '
union all select '002 ', '00008 '
union all select '002 ', '00010 '
union all select '002 ', '00001 '
union all select '002 ', '00003 '
declare @t3 table(人员编码 varchar(10),人员类型 smallint,姓名 varchar(10))
insert into @t3 select '00001 ',0, 'TTT '
union all select '00002 ',0, 'YYY '
union all select '00003 ',1, 'YYY '
union all select '00004 ',1, 'YYY '
union all select '00005 ',2, 'AAA '
union all select '00006 ',3, 'CCC '
union all select '00007 ',4, 'XXX '
union all select '00008 ',2, 'SSS '
union all select '00009 ',3, 'SSS '
union all select '00010 ',4, 'SSS '
union all select '00011 ',2, 'SSS '
;WITH
TM AS(
SELECT DISTINCT
A.任务编码, A.车辆编码,
C.人员类型, C.姓名
FROM @t1 A, @t2 B, @t3 C
WHERE A.任务编码 = B.任务编码
AND B.人员编码 = C.人员编码
),
TP AS(
SELECT
A.*,
姓名 = STUFF(B.re.value( '(/r)[1] ', 'nvarchar(max) '), 1, 1, N ' ')
FROM(
SELECT DISTINCT
任务编码, 车辆编码, 人员类型
FROM TM
)A
OUTER APPLY(
SELECT re = (
SELECT v = 姓名 FROM TM r
WHERE 任务编码 = A.任务编码
AND 车辆编码 = A.车辆编码
AND 人员类型 = A.人员类型
FOR XML AUTO, TYPE
).query( ' <r> {
for $i in /C/@v return(concat( "/ ", string($i)))
} </r> ')
)B
)
SELECT
任务编码, 车辆编码,
[类型0] = [0],
[类型1] = [1],
[类型2] = [2],
[类型3] = [3],
[类型4] = [4]
FROM TP
PIVOT(
MAX(姓名)
FOR 人员类型 IN([0], [1], [2], [3], [4])
)P
-- 结果
任务编码车辆编码类型0类型1类型2类型3类型4
001001TTTYYYAAASSSSSS /XXX
002002TTT /YYYYYYSSSCCCSSS
原帖子:http://community.csdn.net/Expert/topic/5204/5204383.xml?temp=.8536646
[解决办法]
坐SF學習
[解决办法]
服务器: 消息 156,级别 15,状态 1,行 37
在关键字 'WITH ' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 44
第 44 行: ', ' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,行 54
在关键字 'OUTER ' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 60
第 60 行: 'XML ' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 75
第 75 行: '( ' 附近有语法错误。
[解决办法]
看得累得慌,快下班了,帮你顶吧~
[解决办法]
核心就是pivot, sql 2005的行列转换,做报表实用!
[解决办法]
呵呵...
民谣MM 顶
[解决办法]
up
我帮你顶起
[解决办法]
是SQL2005的,CTE和APPLY的用法,这些都是新东西。学习老大。看样子我们2005得加强啊,否则,我们过去掌握的行列转换什么的方法,很快会过时啊,还是树的操作方法也很快会过时
另,民谣MM真是男的吗?重不重?我帮你顶下, 不知道能否等的起啊,呵呵
[解决办法]
不懂,不懂.
[解决办法]
2005下的,
[解决办法]
2005下的CTE,類似建立零時表的功能,對於重複使用的零時表,CTE效率很高.
Pivot table 似乎Excel的樞紐分析的東西 好像還有crosstab的東東.
[解决办法]
看看
[解决办法]
太长了
是不是要实现列转行?
[解决办法]
这个只能用在sql 2005中
;WITH -- 定义公用表达式的标志
TM AS( -- 定义公用表达式, 你可以理解为创建一个名为TM的视图, ()中的就是视图的文本
SELECT DISTINCT
A.任务编码, A.车辆编码,
C.人员类型, C.姓名
FROM @t1 A, @t2 B, @t3 C
WHERE A.任务编码 = B.任务编码
AND B.人员编码 = C.人员编码
),
TP AS(
SELECT
A.*,
姓名 = STUFF(B.re.value( '(/r)[1] ', 'nvarchar(max) '), 1, 1, N ' ')
-- xml类型的value函数
FROM(
SELECT DISTINCT
任务编码, 车辆编码, 人员类型
FROM TM
)A
OUTER APPLY( -- sql 2005新增的outer apply子句, 在这里相当于子查询
-- 但它是在子查询A的每一行上执行的, 而且可以引用A中的列
SELECT re = ( -- 生成xml数据
SELECT v = 姓名 FROM TM r
WHERE 任务编码 = A.任务编码
AND 车辆编码 = A.车辆编码
AND 人员类型 = A.人员类型
FOR XML AUTO, TYPE
).query( ' <r> {
for $i in /C/@v return(concat( "/ ", string($i)))
-- xml类型的query方法
} </r> ')
)B
)
SELECT
任务编码, 车辆编码,
[类型0] = [0],
[类型1] = [1],
[类型2] = [2],
[类型3] = [3],
[类型4] = [4]
FROM TP
PIVOT( -- 新增的行列转置方法
MAX(姓名)
FOR 人员类型 IN([0], [1], [2], [3], [4])
)P