首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求☆☆邹建☆☆详解这段代码,呵呵。确实好用,但是就是不明白。该怎么解决

2012-03-20 
求☆☆邹建☆☆详解这段代码,呵呵。确实好用,但是就是不明白。--table1--任务编码--任务编码主键--table2--任务

求☆☆邹建☆☆详解这段代码,呵呵。确实好用,但是就是不明白。
--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

热点排行