求助 sql 合并行 sum group

  • o
    opensesame
    Snipaste_2020-10-27_13-42-56.png

    想把上面的表合并成下面的表

    sum 语文 数学 英语。。。
    group by 学号的话


    如果没有备注就没问题,有备注怎么办
    这是情况1


    情况2是,两行备注不一样,想合并后变成“备注1|备注2”这样,如何实现呢,谢谢先。
  • n
    numbernine
    Oracle的话有个concate?函数可以合并备注Hi Google
  • o
    opensesame
    谢谢,忘了说,是sql server

    搜了一下,有个函数STUFF,不知道有没有更合适的
  • p
    ptcptr
    -- 准备数据
    if exists (select * from dbo.sysobjects where id = object_id(N'[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table dbo.[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]
    GO
    create table dbo.[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A](
    xh varchar(20),
    yw numeric(18,2),
    sx numeric(18,2),
    yy numeric(18,2),
    wl numeric(18,2),
    hx numeric(18,2),
    bz varchar(100))

    insert dbo.[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A] values('1001',100,null,null,50,100,'备注1')
    insert dbo.[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A] values('1001',null,99,100,60,null,'备注2')
    go




    -- 建立一个函数采集备注
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getbz-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[getbz-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]
    GO

    create Function dbo.[getbz-0F06000F-B5C1-433B-9E51-38C3CA1AA61A](@xh varchar(20))
    returns varchar(4000)
    as
    begin

    declare @bz varchar(4000)
    set @bz=''
    select @bz=@bz+'|'+bz from dbo.[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A] where xh=@xh and isnull(bz,'')<>'' order by bz
    select @bz=ltrim(STUFF(@bz,1,1,''))

    return @bz
    end
    go


    -- 利用函数整理备注,成绩直接求和
    select xh,yw=sum(yw),sx=sum(sx),yy=sum(yy),wl=sum(wl),hx=sum(hx),
    bz=max(dbo.[getbz-0F06000F-B5C1-433B-9E51-38C3CA1AA61A](xh))
    from dbo.[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A] group by xh
    go




    -- 删除临时表和临时函数
    if exists (select * from dbo.sysobjects where id = object_id(N'[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table dbo.[temptable-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]
    GO


    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getbz-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[getbz-0F06000F-B5C1-433B-9E51-38C3CA1AA61A]
    GO
  • i
    iamgs
    1. --1.建立模拟数据
    2. WITH a
    3. AS (SELECT 1001 学号,
    4. 100 语文,
    5. 0 数学,
    6. 0 英语,
    7. 50 物理,
    8. 100 化学,
    9. '有备注' 备注
    10. UNION ALL
    11. SELECT 1001 学号,
    12. 0 语文,
    13. 99 数学,
    14. 100 英语,
    15. 60 物理,
    16. 0 化学,
    17. NULL 备注)
    18. --2.查询
    19. SELECT 学号,
    20. SUM(语文) 语文,
    21. SUM(数学) 数学,
    22. SUM(英语) 英语,
    23. SUM(物理) 物理,
    24. SUM(化学) 化学,
    25. STUFF(
    26. (
    27. SELECT ',' + 备注 FROM a WHERE c.学号 = 学号 FOR XML PATH('')
    28. ),
    29. 1,
    30. 1,
    31. ''
    32. ) AS 备注
    33. FROM a AS c
    34. GROUP BY 学号;
    复制代码


    查询结果:
    1. 学号 语文 数学 英语 物理 化学 备注
    2. 1001 100 99 100 110 100 有备注
    复制代码
  • o
    opensesame
    看来就是stuff,谢谢了HiPDA·NG