计算客户的应收帐款

时间:2019-04-04 08:44:35

标签: sql-server

我正在尝试计算所有客户应收帐款清单。
我计算客户的销售和收货清单,现在我陷入了如何计算应收账款的问题。

所有客户的销售报告

Select c.StakeHolderId, c.CompanyName, sum(s.Amount) as TotalSales from
StakeHolders c
left Join Sales s on
c.StakeHolderId = s.BuyerId
where c.StakeHolderTypeId = '0b85a69e-55f2-4142-a49d-98e22aa7ca10'
group By c.StakeHolderId, c.CompanyName

所有客户收据

Select c.StakeHolderId, c.CompanyName, sum(pr.Amount) as TotalReceipts 
from
StakeHolders c
left Join PaymentsAndReceipts pr on
c.StakeHolderId = pr.StakeHolderId
where c.StakeHolderTypeId = '0b85a69e-55f2-4142-a49d-98e22aa7ca10'
group By c.StakeHolderId, c.CompanyName

我已经尝试过,但是没有得到正确的结果。

Select
c.StakeHolderId,
c.CompanyName,
sum(s.Amount) - sum(pr.Amount) as Receivables
from Sales s
right outer join StakeHolders c on
c.StakeHolderId = s.BuyerId
left outer join PaymentsAndReceipts pr on
pr.StakeHolderId = c.StakeHolderId
where c.StakeHolderTypeId = '0b85a69e-55f2-4142-a49d-98e22aa7ca10'
Group By c.StakeHolderId,c.CompanyName

预期结果:

enter image description here

2 个答案:

答案 0 :(得分:1)

这对您有用吗?:

WITH [CalculatedData] AS
(
    SELECT
        C.[StakeHolderId],
        C.[CompanyName],
        COALESCE((SELECT SUM([Amount])
                  FROM [Sales]
                  WHERE [BuyerId] = C.[StakeHolderId]
                 ), 0) AS [TotalSales],
        COALESCE((SELECT SUM([Amount])
                  FROM [PaymentsAndReceipts]
                  WHERE [StakeHolderId] = C.[StakeHolderId]
                 ), 0) AS [TotalReceipts]

    FROM
        [StakeHolders] AS C
    WHERE
        C.[StakeHolderTypeId] = '0b85a69e-55f2-4142-a49d-98e22aa7ca10'
)
SELECT
    [StakeHolderId],
    [CompanyName],
    [TotalSales] - [TotalReceipts] AS [Receivables]
FROM
    [CalculatedData]

请注意,我在结果中包括负值。如果希望在括号之间显示负值,也可以,但是需要在查询结果中将数字数据转换为文本数据。恕我直言,这不是一种灵活的策略(因为您失去了执行任何其他客户端计算的选项),这应该是客户端正确设置值格式的目的。

编辑:

如果您不喜欢通用表表达式,可以将其转换为正则表表达式:

SELECT
    [StakeHolderId],
    [CompanyName],
    [TotalSales] - [TotalReceipts] AS [Receivables]
FROM
    (
        SELECT
            C.[StakeHolderId],
            C.[CompanyName],
            COALESCE((SELECT SUM([Amount])
                      FROM [Sales]
                      WHERE [BuyerId] = C.[StakeHolderId]
                     ), 0) AS [TotalSales],
            COALESCE((SELECT SUM([Amount])
                      FROM [PaymentsAndReceipts]
                      WHERE [StakeHolderId] = C.[StakeHolderId]
                     ), 0) AS [TotalReceipts]

        FROM
            [StakeHolders] AS C
        WHERE
            C.[StakeHolderTypeId] = '0b85a69e-55f2-4142-a49d-98e22aa7ca10'
    ) AS [CalculatedData]

答案 1 :(得分:0)

只需按StakeHolderId和公司名称将第一个查询LEFT JOIN移至第二个查询联接。在那之后,将销售额减去收据

const