PID  PName PAmount PAddress
aaa1 张三   10000   四川省
aaa1 李四   20000   四川省
aaa1 王五   30000   四川省结果:ID           PID  PName            PAmount PAdress
row_number   aaa1 张三、李四、王五     60000   四川省
本来解决的思路:
将数据根据PID order by ,然后一一比对。因为查询条件很多,这样order by 了 会冲突其他条件上的order by 不可行。

解决方案 »

  1.   


    create table #tab(PID varchar(50),PName varchar(50), PAmount int, PAddress varchar(50))
    insert into #tab
    select 'aaa1', '张三',   10000,   '四川省' union all
    select 'aaa1', '李四',   20000,   '四川省' union all
    select 'aaa1', '王五',   30000,   '四川省'select ROW_NUMBER()over(order by PID)id,PID,
    (select stuff((
    select ','+PName from #tab for xml path('')),1,1,''))PName,
    sum(PAmount)PAmount,
    PAddress
    from #tab
    group by PID,PAddress
    ---------------------------------------------------------------------
    id                   PID                                                PName                                                                                                                                                                                                                                                            PAmount     PAddress
    -------------------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- --------------------------------------------------
    1                    aaa1                                               张三,李四,王五                                                                                                                                                                                                                                                         60000       四川省(1 行受影响)
      

  2.   

    通过函数来合并字符串:
    create table tab
    (PID varchar(50),PName varchar(50), PAmount int, PAddress varchar(50))insert into tab
    select 'aaa1', '张三',   10000,   '四川省' union all
    select 'aaa1', '李四',   20000,   '四川省' union all
    select 'aaa1', '王五',   30000,   '四川省'godrop function fn_mergeSTR
    gocreate function dbo.fn_mergeSTR
    (@pid varchar(50),@paddress varchar(50),@split varchar(10))  
    returns varchar(300)  
    as  
    begin  
        declare @str varchar(300);  
          
        set @str = '';  
          
        select @str = @str + pname + @split  
        from tab  
        where pid = @pid
              and paddress = @paddress  
          
        set @str = left(@str , len(@str) - LEN(@split) )  
          
        return @str   --返回值   
    end  
    go  
    select row_number() over(order by pid ) as id,
           pid,
           
           dbo.fn_mergeSTR(pid,paddress,',') as pname,
           sum(pamount) pamount,
           paddress
    from tab
    group by pid,
             paddress/*
    id pid     pname         pamount paddress
    1 aaa1 张三,李四,王五 60000 四川省
    */
      

  3.   


    declare @t varchar(55)
    set @t=''
    select @t=@t+','+pname from province
    set @t=stuff(@t,1,1,'')select pid,paddress,sum(pamount),@t from province group by pid,paddress
      

  4.   

    for xml path 性能如何?
      

  5.   

    for xml path 性能如何?好像没函数好
      

  6.   

    WITH CTE (PId,Pname,PAmount,PAddress)
    AS (
    SELECT 'aaa1', N'张三',   10000,   N'四川省' UNION ALL
    SELECT 'aaa1', N'李四',   20000,   N'四川省' UNION ALL
    SELECT 'aaa1', N'王五',   30000,   N'四川省' UNION ALL
    SELECT 'aaa2', N'小刚',   40000,   N'北京' UNION ALL
    SELECT 'aaa2', N'小敏',   30000,   N'北京' UNION ALL
    SELECT 'aaa3', N'小王',   40000,   N'内蒙' 
    )
    SELECT ROW_NUMBER() OVER(ORDER BY A.PID) AS ID
    ,A.PId
    ,STUFF((SELECT ','+Pname
    FROM CTE
    WHERE PId=A.PId
    FOR XML PATH('')),1,1,'')
    ,SUM(A.PAmount) AS PAmount
    ,A.PAddress
    FROM CTE AS A
    GROUP BY A.PId,A.PAddress
      

  7.   


    create table #tab(PID varchar(50),PName varchar(50), PAmount int, PAddress varchar(50))
    insert into #tab
    select 'aaa1', '张三',   10000,   '四川省' union all
    select 'aaa1', '李四',   20000,   '四川省' union all
    select 'aaa1', '王五',   30000,   '四川省';with ceb as 
    (
    select  Row_number() over( order by PID desc) as RN,PID,
    (stuff((select  (','+PName) from #tab a where a.PID=b.PID for xml path('')),1,1,'')) as PName,
    SUM(PAmount) as PAmount,PAddress
     from #tab b group by PID,PAddress
     )
     select * from ceb
      

  8.   


    可以略做修改:  declare @t varchar(55)
    set @t=''
    select @t=isnull(@t+',','')+pname from province
    select pid,paddress,sum(pamount),@t from province group by pid,paddress
      

  9.   


    可以略做修改:  declare @t varchar(55)
    set @t=''
    select @t=isnull(@t+',','')+pname from province
    select pid,paddress,sum(pamount),@t from province group by pid,paddress
    你这样可以吗? 算出来的@t是这个表里的所有行的pname的拼接,而不是按pid分组的行的pname的拼接