Изменить 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