Как создать новую итоговую строку для каждого счета-фактуры, которая показывает сумму каждого уникального счета-фактуры? - PullRequest
0 голосов
/ 26 февраля 2020

Как мне создать новую итоговую строку для каждого счета-фактуры, которая показывает сумму каждого уникального счета-фактуры? Я считаю, что есть функция окна с использованием раздела. На рисунке ниже каждый счет-фактура должен иметь одинаковые «TAX AMT» и «FRGHT AMT», если таковые имеются (в данном случае это 0,00). Я пытаюсь создать новую строку после каждого «СЧЕТА», которая суммирует «TAX AMT», «FRGHT AMT» один раз и «EXT PRICE» и помещает ее в «TOT MAT».

Второй изображение показывает, что я пытаюсь произвести.

SELECT ORDERNUM AS INVOICE
    ,PRODUCTLIST.ID AS ITEM
    ,PRODUCTLIST.DESC1 AS [DESC]
    ,INVDATE AS [INV DATE]
    ,format(USELL, 'N') AS PRICE
    ,QTYSOLD - QTYRETN AS QTY
    ,format(DOLSOLD - DOLRETN, 'N') AS [EXT PRICE]
    ,format(TAX_AMOUNT, 'N') AS [TAX AMT]
    ,format(FREIGHT, 'N') AS [FRGHT AMT]
    ,0.00 AS [HDL]
    ,0.00 AS [TOT MAT]
    ,PO_NUMBER AS [PO NBR]
FROM History
INNER JOIN PRODUCTLIST ON PARTNUM = UID
WHERE BILLTOID = '28736'
    AND INVDATE >= '2/21/2020' --and ordernum = 'S2149853.001'
ORDER BY INVDATE
    ,ORDERNUM

enter image description here

enter image description here

1 Ответ

1 голос
/ 26 февраля 2020

Изменить 01: Обновлен последний запрос, чтобы не суммировать TAXAMT и FRGHTAMT

Вы были на правильном пути. Мы будем использовать оконные агрегаты, чтобы получить итоговую сумму по счету, и объединение, чтобы добавить ее в качестве новой строки.

Создание примера данных:

DECLARE @tbl TABLE (
    INVOICE INT,
    EXTPRICE NUMERIC(32,2),
    TAXAMT NUMERIC(32,2),
    FRGHTAMT NUMERIC(32,2)
)

INSERT INTO @tbl
VALUES
(1,172.5,0,0)
,(1,105.26,0,0)
,(1,15.76,0,0)
,(1,129.64,0,0)
,(1,42.1,0,0)
,(1,284.22,0,0)
,(1,23.14,0,0)
,(1,90.52,0,0)
,(1,168.4,0,0)
,(2,11.46,0,0)
,(2,13.75,0,0)
,(2,17.95,0,0)
,(2,13.46,0,0)
,(2,13.46,0,0)

Далее нам нужно вычислить общую сумму EXTPRICE по счету + итоговый TAXAMT по счету + итоговый FRGHTAMT по счету.

SELECT
    *,
    SUM(EXTPRICE) OVER (PARTITION BY INVOICE)   --Total EXTPRICE by invoice
    + SUM(TAXAMT) OVER (PARTITION BY INVOICE)   --Total TAXAMT by invoice
    + SUM(FRGHTAMT) OVER (PARTITION BY INVOICE) --TOTAL FRGHTAMT by invoice
        AS InvoiceTotal
FROM @tbl

Наконец, для того, чтобы это была новая строка вместо дополнительного столбца, нам потребуется дважды запросить таблицу и объединить их. Поскольку для объединений требуется одинаковое количество столбцов и типов данных, я оставляю Итоговую сумму счета как NULL для отдельных позиций и оставляю отдельные цены NULL для общей суммы. Вы также можете сделать промежуточный итог по отдельным позициям, если хотите.

Редактировать 01: InvoiceTotal обновлен для подсчета TAXAMT & FRGHTAMT только один раз вместо суммирования его в оконной функции.

SELECT
    INVOICE,
    'LineItem' AS RecordType,
    EXTPRICE,
    TAXAMT,
    FRGHTAMT,
    NULL AS InvoiceTotal
FROM @tbl
UNION ALL
SELECT DISTINCT
    INVOICE,
    'Total',
    NULL,
    NULL,
    NULL,
    SUM(EXTPRICE) OVER (PARTITION BY INVOICE)   --Total EXTPRICE by invoice
    + TAXAMT
    + FRGHTAMT
        AS InvoiceTotal
FROM @tbl
ORDER BY INVOICE,RecordType
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...