【问题标题】:How to sum and subtract one column value based on percentage in SQL Server 2008如何在 SQL Server 2008 中根据百分比对一列值进行求和和减去
【发布时间】:2021-12-16 00:52:40
【问题描述】:
DECLARE @BalanceTblRec TABLE 
                       (
                           NetAmount decimal(18, 3), 
                           Percentage int, 
                           [Description] nvarchar(max)
                       )
DECLARE @BalanceTblPay TABLE 
                       (
                           NetAmount decimal(18, 3), 
                           Percentage int, 
                           [Description] nvarchar(max)
                       )

INSERT INTO @BalanceTblRec 
VALUES (21, 11, 'ReceiveReceipt'),
       (20, 11, 'ReceiveReceipt'),
       (20, 10, 'ReceiveReceipt'),
       (20, 20, 'ReceiveReceipt'), 
       (10, 10, 'ReceiveReceipt')

INSERT INTO @BalanceTblPay 
VALUES (10, 11, 'PayReceipt'),
       (10, 11, 'PayReceipt'), 
       (10, 2, 'PayReceipt'),
       (5, 15, 'PayReceipt'),
       (30, 10, 'PayReceipt'),
       (20, 10, 'PayReceipt')

;WITH MaPercentage AS
( 
    SELECT
        Percentage, 
        SUM(NetAmount) AS Net, 
        'Receive' AS Flag 
    FROM
        @BalanceTblRec 
    GROUP BY
        Percentage
    UNION ALL
    SELECT 
        Percentage, 
        SUM(NetAmount) AS Net, 
        'Pay' AS Flag 
    FROM
        @BalanceTblPay 
    GROUP BY 
        Percentage
)
SELECT * FROM MaPercentage 

现在我想从net 中减去net,基于falgreceive - pay 基于百分比。

像这样:

Per Net         Flag
-----------------------
10  30.000 - 50 Receive
11  41.000 - 20 Receive
20  20.000      Receive
2   10.000      Pay
15  5.000       Pay

【问题讨论】:

  • net 中减去net 为零...我认为您需要改写一下。
  • 从 net 中减去 net 表示其相同的列,但基于相同的百分比和标志(即接收 - 支付),因为您可以在上一节中看到我想要的结果
  • 顺便说明一下:SQL Server 2008 和 2008 R2 目前完全不受支持(甚至超出了扩展支持) - red-gate.com/simple-talk/sql/database-administration/… - 是时候升级了!跨度>
  • 感谢您的注意,我害怕升级,因为很多更改可能在更高版本的 sql 中不起作用,您能否确认它完全保存从 2008 升级到最新版本而不是语法或任何其他兼容问题

标签: sql sql-server sql-server-2008


【解决方案1】:

我想这就是你想要的:

DECLARE @BalanceTblRec TABLE (NetAmount decimal(18,3), Percentage int, [Description] nvarchar(max))
DECLARE @BalanceTblPay TABLE (NetAmount decimal(18,3), Percentage int, [Description] nvarchar(max))

insert into @BalanceTblRec values (21, 11, 'ReceiveReceipt'),(20, 11, 'ReceiveReceipt'),(20, 10, 'ReceiveReceipt'),(20, 20, 'ReceiveReceipt'), (10, 10, 'ReceiveReceipt')
insert into @BalanceTblPay values (10, 11, 'PayReceipt'),(10, 11, 'PayReceipt'),(10, 2, 'PayReceipt'),(5, 15, 'PayReceipt'),(30, 10, 'PayReceipt') ,(20, 10, 'PayReceipt')


;WITH MaPercentage as ( 
select Percentage, sum(NetAmount) as Net, 'Receive' as Flag from @BalanceTblRec group by Percentage
union all
select Percentage, -sum(NetAmount) as Net, 'Pay' as Flag from @BalanceTblPay group by Percentage
)

select 
  Percentage, 
  abs(sum(net)) as SumNet,
  case when sum(net) > 0 then 'Receive' 
  else 'Pay'
  end as Flag
from MaPercentage 
group by Percentage

只是更改了按百分比分组的“支付和总和”中的符号。

【讨论】:

  • 是的,我想要的结果完全一样,谢谢
【解决方案2】:

另一种方法是将收款与付款完全联接。

;WITH RCV AS (
  select Percentage, sum(NetAmount) as Net
  from @BalanceTblRec
  group by Percentage
)
, PAY AS (
  select Percentage, sum(NetAmount) as Net
  from @BalanceTblPay 
  group by Percentage
)
SELECT 
COALESCE(r.Percentage, p.Percentage) AS Percentage, 
ABS(COALESCE(r.Net, 0) - COALESCE(p.Net, 0)) AS Net, 
(CASE 
 WHEN (COALESCE(r.Net, 0) - COALESCE(p.Net, 0)) < 0 THEN 'Pay'
 ELSE 'Receive'
 END) AS Flag
FROM RCV r
FULL JOIN PAY p ON p.Percentage = r.Percentage

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多