原表:
[ID][ID1]   [fName] [fValue] 
  1    12       语文    80 
  1    12       英语    70
  1    12       数学    50
  1    13       数学    90 
  2    12       物理    85 
  2    12       语文    85 
  3    13       数学    92 
  3    12       物理    82 
  4    12       数学    60 合并后[ID][ID1]   [Value] 
  1    12     语文(80)英语(70) 
  1    13     数学(90) 
  2    12     物理(85)语文(85) 
  3    13     数学(92) 
  3    12     物理(82) 
  4    12     数学(60) 因为上面表是我用临时表组成的再来合并的,我知道用函数可以实现,但是函数中好像不能使用临时表。具体需求就是把ID和ID1想同的行的列[fname]和[fValue]两列(这里可能有多列,同时列可以还有判断,比如说成绩不合格的不显示,像1 12 数学不合格,就是说合并列时有判断的)合并成一个列[Value],在下试过很多方法都无法实现,希望高手能给个脚本谢谢!还有个问题!我上面是在存储过程中实现的,如在程序的逻辑层来处理也可以,但是我的处理数据可能有几千到几万行,在逻辑层处理因为太慢了,因些我想这样,先把处理后的临时表数据放到物理表。这可就可以使用函数,但听说使用函数会把处理搞的很慢,请问是这样吗?

解决方案 »

  1.   

    -- 临时表
    CREATE TABLE #(
    ID int, [ID1] int,   [fName] nvarchar(10), [fValue] int)
    INSERT #
    SELECT 1, 12, N'语文', 80  UNION ALL
    SELECT 1, 12, N'英语', 70 UNION ALL
    SELECT 1, 12, N'数学', 50 UNION ALL
    SELECT 1, 13, N'数学', 90  UNION ALL
    SELECT 2, 12, N'物理', 85  UNION ALL
    SELECT 2, 12, N'语文', 85  UNION ALL
    SELECT 3, 13, N'数学', 92  UNION ALL
    SELECT 3, 12, N'物理', 82  UNION ALL
    SELECT 4, 12, N'数学', 60 -- 合并查询
    SELECT
    A.*, Value = LTRIM(B.re)
    FROM(
    SELECT DISTINCT
    ID, ID1
    FROM #
    )A
    OUTER APPLY(
    SELECT Re = (
    SELECT c = RTRIM(fname) + QUOTENAME(fvalue, '()')
    FROM # r
    WHERE ID = A.ID
    AND ID1 = A.ID1
    AND Fvalue >= 60  -- 要求及格
    FOR XML AUTO, TYPE
    ).query('<r>{for $i in /r/@c return(concat(" ",string($i)))}</r>').value('(/r)[1]','nvarchar(1000)')
    )B
    GODROP TABLE #-- 结果:
    ID ID1 Value
    1 12 语文(80)  英语(70)
    1 13 数学(90)
    2 12 物理(85)  语文(85)
    3 12 物理(82)
    3 13 数学(92)
    4 12 数学(60)
      

  2.   

    -- 如果是 sql 2000, 可以用这样的处理方法SELECT
    oid = IDENTITY(int, 1, 1),
    id, id1, value = CONVERT(nvarchar(4000), RTRIM(fname) + QUOTENAME(fvalue, '()'))
    INTO #1
    FROM #
    WHERE [fValue] >= 60
    ORDER BY id, id1
    DECLARE @id int, @id1 int, @value nvarchar(4000)
    UPDATE A SET
    @value = CASE WHEN @id = ID AND @id1 = ID1 THEN @value + N'  ' + value ELSE value END,
    value = @value,
    @id = ID, @id1 = ID1
    FROM #1 A
    SELECT id, id1, value FROM #1 A
    WHERE NOT EXISTS(
    SELECT * FROM #1
    WHERE ID = A.ID AND ID1 = A.ID1 AND oid > A.oid)
    DROP TABLE #1
      

  3.   

    非常感谢 zjcxc(邹建) 老大的回复
    不过现在需求发生了改变:实现这样
    id       titleName         todoID  itemID    value1         value2      value3 
    7496 姓名          35702 153853 Jack         NULL NULL
    7500 工作满意度 35702 15265 满意       NULL NULL
    7500 工作满意度 35702 15266 非常满意       NULL NULL
    7500 工作满意度 35702 15267 不满意      NULL        NULL
    7503 培训          35702 NULL NULL     它必另填 NULL
    7503 培训           35702 15272 有         NULL NULL
    7503 培训          35702 15276 其它      NULL          NULL
    7504 表现           35702 15279 不好      NULL          1
    7504 表现           35702 15278 非常好      NULL          2
    7504 表现           35702 15277 好      NULL          37496     姓名                35703  153853     peter         NULL       NULL
    7500 工作满意度   35703 15265 非常满意      NULL        NULL
    7500 工作满意度   35703 15266 满意      NULL         NULL
    7500 工作满意度   35703 15267 不满意      NULL  NULL
    7503 培训            35703 NULL NULL     它必另填 NULL
    7503 培训           35703 15272 有      NULL         NULL
    7503 培训           35703 15276 其它      NULL         NULL
    7504 表现           35703 15279 不好      NULL         1
    7504 表现           35703 15278 非常好      NULL         2
    7504 表现           35703 15277 好      NULL         3合并后的表单
    id       titleName      todoID     value1
    7496     姓名          35702     Jack
    7500     工作满意度    35702     (1).满意 (2).非常满意 (3).不满意
    7503     培训          35702     (1).有 (2).一点点 (3).其它 它必另填
    7504     表现          35702     (1).不好 (2).非常好 (3).好7496     姓名          35702     Jack
    7500     工作满意度    35702     (1).满意 (2).非常满意 (3).不满意
    7503     培训          35702     (1).有 (2).一点点 (3).其它 它必另填
    7504     表现          35702     (1).不好 (2).非常好 (3).好小弟不才,不能举一反三,我打算这样实现,id,和todoID相同的行合并,同时当value3不为NULL时就以[value3]列排序,像[表现] 行一样,如果为null,就以itemID排序,你[工作满意度]列那样。但[培训]中有一行的itemID为空时就把value2的值放到以[itemID]列排序的最后,如(3).其它 它必另填,如老大能帮小弟解决这个问题再加50分。不过不知怎么加分吗?
      

  4.   

    上面和todoID值打错了,应像下面
    id       titleName      todoID     value1
    7496     姓名          35702     Jack
    7500     工作满意度    35702     (1).满意 (2).非常满意 (3).不满意
    7503     培训          35702     (1).有 (2).一点点 (3).其它 它必另填
    7504     表现          35702     (1).不好 (2).非常好 (3).好7496     姓名          35703     Jack
    7500     工作满意度    35703     (1).满意 (2).非常满意 (3).不满意
    7503     培训          35703     (1).有 (2).一点点 (3).其它 它必另填
    7504     表现          35703     (1).不好 (2).非常好 (3).好
      

  5.   

    zjcxc(邹建) 老大 如果我的数据有1300行的话, 这个存储过程执行了10几秒,这样可能不行啊!请问zjcxc(邹建) 老大一下,如果我有一万条以上的数据,要导出EXCEL,该用什么方案啊?