1.表a结构如下:
code      value  lev
zb        null   1
zb.sz     null   2
zb.sz.01  11     3
zb.sz.02  10     3
zb.sz.03  9      3
zb.sy     null   2
zb.sy.01  5      3
zb.sy.02  4      3
需要更新父级值,得到如下结果
code      value  lev
zb        39     1
zb.sz     30     2
zb.sz.01  11     3
zb.sz.02  10     3
zb.sz.03  9      3
zb.sy     9      2
zb.sy.01  5      3
zb.sy.02  4      32.表b结构如下
code val1 val2 val3
01   10    20    30
02   11    12    13
03   101   88    0
需要行转列如下结果
code 01 02 03
val1 10 11 101
val2 20 12 88
val3 30 13 0分数不多,求高人

解决方案 »

  1.   

    行转列看这里:http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html
      

  2.   

    本帖最后由 josy 于 2012-10-09 00:07:36 编辑
      

  3.   

    /*
    ---递归更新父级节点DECLARE @a TABLE
    ( code varchar(10), value int, lev int)INSERT INTO @a
      SELECT 'zb', null , 1
      UNION ALL
      SELECT 'zb.sz', null, 2
      UNION ALL
      SELECT 'zb.sz.01', 11, 3
      UNION ALL
      SELECT 'zb.sz.02', 10, 3
      UNION ALL
      SELECT 'zb.sz.03' ,9, 3
      UNION ALL
      SELECT 'zb.sy' ,null, 2
      UNION ALL
      SELECT 'zb.sy.01', 5, 3
      UNION ALL
      SELECT 'zb.sy.02' ,4, 3  -- 准备测试数据IF OBJECT_ID('tempdb..#temp') IS NOT NULL
    DROP TABLE #temp;WITH c1 AS  --将源表中的父节点展示出来,parent列;(包括根节点)
    (
    SELECT a.code parent, b.code, b.value, b.lev 
    FROM @a a
    JOIN @a b ON CHARINDEX(a.Code, b.code) <> 0 AND b.lev - a.lev = 1 UNION ALL
    SELECT NULL, a.code, a.value, a.lev  
    FROM @a a
    WHERE a.lev = 1
    )
    SELECT *
    INTO #temp
    FROM c1
    DECLARE @level int = ( SELECT MAX(lev) FROM #temp )  -- 找出叶子节点所在的层级WHILE(@level <> (SELECT MIN(lev) FROM #temp))
      BEGIN
      
        UPDATE t ---更新父表t中的内容,t作为父表,c作为子表
        SET t.value = c.SumValue
        FROM #temp t
     INNER JOIN
     (
    SELECT parent, SUM(value) SumValue
    FROM #temp
    WHERE lev = @level
    GROUP BY parent
     ) c ON t.code = c.parent
    SET @level = @level - 1
      
      END   
    SELECT *
    FROM #temp
    ORDER BY lev
    **/----测试结果
    parent     code       value       lev
    ---------- ---------- ----------- -----------
    NULL       zb         39          1
    zb         zb.sz      30          2
    zb         zb.sy      9           2
    zb.sz      zb.sz.01   11          3
    zb.sz      zb.sz.02   10          3
    zb.sz      zb.sz.03   9           3
    zb.sy      zb.sy.01   5           3
    zb.sy      zb.sy.02   4           3(8 row(s) affected)
    行列互换写不下去了,想睡觉了……
      

  4.   

    晕   可以用CHARINDEX,不用划分层级的,哎!想复杂了……