Рассчитать дебиторскую задолженность клиентов - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь рассчитать список всех клиентов A / C Receivables.
Я рассчитываю список продаж и поступлений клиентов, теперь я застрял, как рассчитать дебиторскую задолженность.

Весь отчет о продажах клиента

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 ]

1 голос
/ 04 апреля 2019

У вас это работает?:

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]

Обратите внимание, что я включаю отрицательные значения в результат. Если вы хотите, чтобы в скобках отображались отрицательные значения, это тоже возможно, но для этого потребуется преобразовать числовые данные в текстовые данные в результатах запроса. ИМХО, это не гибкая стратегия (поскольку вы теряете возможность выполнять какие-либо дополнительные вычисления на стороне клиента), и целью клиента должно быть правильное форматирование значений.

Edit:

Если вам не нравятся Common Table Expressions, вы можете преобразовать его в регулярное табличное выражение:

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]
0 голосов
/ 04 апреля 2019

просто принять первый запрос LEFT JOIN для соединения второго запроса по StakeHolderId & companyname.После этого берут продажи вычитают чеки

SELECT S.StakeHolderId, S.CompanyName, 
       Receivables = TotalSales - ISNULL(TotalReceipts , 0)
FROM
(
    -- this is your first query
    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
) S
LEFT JOIN
(
    -- this is your second query
    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
) R    ON S.StakeHolderId = R.StakeHolderId
      AND S.CompanyName   = R.CompanyName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...