如何在 SQL Server 中按列和按行求和? [英] How to sum column wise and row-wise in SQL Server?

查看:123
本文介绍了如何在 SQL Server 中按列和按行求和?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请看下面

我要找的是

总计应该在行和列级别

我的尝试

declare @t table(aggrementid varchar(20), bom_pos int, bucket int null, paymentstatus varchar(50))

insert into @t 
    select '1', 3000, null, null  
    union all 
    select '2', 3000, 0, 'Non-Delinquient' 
    union all
    select '3', 4000, 0, 'Non-Delinquient' 
    union all 
    select '4', 5000, 0, 'Non-Delinquient' 
    union all 
    select '5', 7000, 0, 'NPA' 
    union all 
    select '6', 8000, 1, 'NPA'

Select 
    bucket,
    [Non-Delinquient], [NPA], [RollBack], [RollForward],
    [Stabilized], [Normalized], [PaymentStatusY],
    Total = iif([Non-Delinquient] is null, 0, [Non-Delinquient]) + 
        iif([NPA] is null, 0, [NPA]) + 
        iif([RollBack] is null, 0, [RollBack]) + 
        iif([RollForward] is null, 0, [RollForward]) + 
        iif([Stabilized] is null, 0, [Stabilized]) + 
        iif([Normalized] is null, 0, [Normalized]) + 
        iif([PaymentStatusY] is null, 0, [PaymentStatusY])
From
    (Select 
         --aggrementid, 
         bom_pos,
         bucket, paymentstatus      
     From 
         @t) as PivotSource
PIVOT
    (sum(bom_pos) FOR paymentstatus IN ([Non-Delinquient], [NPA],[RollBack],[RollForward],[Stabilized],[Normalized],[PaymentStatusY])
    ) as Pvt
Where 
    bucket is not null

返回这个结果:

另外,是否可以通过使用 Rollup 函数等来实现?

Also, can the same can be achieved by using Rollup function etc?

推荐答案

我认为你可以使用 GROUP BYGROUPING SETS

I think you can use GROUP BY with GROUPING SETS

declare @t table(aggrementid varchar(20), bom_pos int, bucket int null, paymentstatus varchar(50))

insert into @t 
    select '1', 3000, null, null  
    union all 
    select '2', 3000, 0, 'Non-Delinquient' 
    union all
    select '3', 4000, 0, 'Non-Delinquient' 
    union all 
    select '4', 5000, 0, 'Non-Delinquient' 
    union all 
    select '5', 7000, 0, 'NPA' 
    union all 
    select '6', 8000, 1, 'NPA'

Select 
    isnull(CAST(bucket AS varchar(10)),'Total') bucket,
    SUM([Non-Delinquient]) [Non-Delinquient],
    SUM([NPA]) [NPA],
    SUM([RollBack]) [RollBack],
    SUM([RollForward]) [RollForward],
    SUM([Stabilized]) [Stabilized],
    SUM([Normalized]) [Normalized],
    SUM([PaymentStatusY]) [PaymentStatusY],
    SUM(isnull([Non-Delinquient],0) + isnull([NPA],0) + isnull([RollBack],0) + isnull([RollForward],0) + isnull([Stabilized],0) + isnull([Normalized],0) + isnull([PaymentStatusY],0)) Total
From
    (Select 
         --aggrementid, 
         bom_pos,
         bucket, paymentstatus      
     From 
         @t) as PivotSource
PIVOT
    (sum(bom_pos) FOR paymentstatus IN ([Non-Delinquient], [NPA],[RollBack],[RollForward],[Stabilized],[Normalized],[PaymentStatusY])
    ) as Pvt
Where 
    bucket is not null
GROUP BY GROUPING SETS(
                        (bucket),
                        ()
                      )

另请参阅以下示例以了解其工作原理

See also the following example for understanding how it works

SELECT
  CASE GROUPING_ID(GroupID,SubgroupID)
    WHEN 3 THEN 'Total'
    WHEN 1 THEN 'Subtotal by Group'
    WHEN 0 THEN ''
  END RowTitle,

  GroupID,
  SubgroupID,
  SUM(Value) Value
FROM
  (
    SELECT 1 GroupID,1 SubgroupID,10 Value
    UNION ALL SELECT 1 GroupID,2 SubgroupID,5 Value
    UNION ALL SELECT 1 GroupID,3 SubgroupID,5 Value
    UNION ALL SELECT 2 GroupID,1 SubgroupID,11 Value
    UNION ALL SELECT 2 GroupID,2 SubgroupID,12 Value
  ) q
GROUP BY GROUPING SETS(
            (GroupID,SubgroupID),
            (GroupID),
            ()
          )

您也可以使用 SUMCASE 代替 PIVOT.对我来说更清楚

You also can use SUM with CASE instead PIVOT. For me it's more clearly

SELECT
  bucket,
  SUM(CASE WHEN paymentstatus='Non-Delinquient' THEN bom_pos END) [Non-Delinquient],
  SUM(CASE WHEN paymentstatus='NPA' THEN bom_pos END) [NPA],
  SUM(CASE WHEN paymentstatus='RollBack' THEN bom_pos END) [RollBack],
  SUM(CASE WHEN paymentstatus='RollForward' THEN bom_pos END) [RollForward],
  SUM(CASE WHEN paymentstatus='Stabilized' THEN bom_pos END) [Stabilized],
  SUM(CASE WHEN paymentstatus='Normalized' THEN bom_pos END) [Normalized],
  SUM(CASE WHEN paymentstatus='PaymentStatusY' THEN bom_pos END) [PaymentStatusY],
  SUM(bom_pos) Total
FROM @t
WHERE paymentstatus IN('Non-Delinquient', 'NPA','RollBack','RollForward','Stabilized','Normalized','PaymentStatusY')
GROUP BY GROUPING SETS(
                        (bucket),
                        ()
                      )

这篇关于如何在 SQL Server 中按列和按行求和?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆