SQL Результаты сервера сгруппированы по программам, валюте с итоговой строкой - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над хранимой процедурой, которая извлекает данные из SQL серверной базы данных и создает записи. Я бы хотел, чтобы все записи для конкретной программы и валюты с итоговой строкой внизу. На данный момент в скрипте есть итоговая запись перед результатами и она не разбита по валютам. Я попытался добавить валюту в группу by, но это усугубило ситуацию.

Мой сценарий -

    DECLARE @runDate DateTime = '2020-05-19'
    SELECT
        t1.RecDate AS [RecDate]
        ,t1.Program AS [Program]
        ,t1.Currency AS [Currency]
        ,t1.SupplierName AS [SupplierName]
        ,t1.SupplierAccount AS [SupplierAccount]
        ,t1.RecStatus   AS [RecStatus]
        ,t4.Type        AS [TYPE]
        ,t1.Date        AS [PiDate]
        ,t1.DiscountedDate  AS [DiscountedDate]
        ,t1.PaymentAmount   AS [Payment]

    FROM orb_RootRecords t1
    LEFT JOIN orb_SupplierRecords t3 on t3.OrbianAccountId = t1.SupplierAccount
    LEFT JOIN orb_AccountType t4 on t4.Id = t3.AccountTypeId
    WHERE FLOOR(CAST(t1.RecDate as float)) = FLOOR(CAST(@runDate as float))
    --ORDER BY [SORT], [Program]    ,[CURRENCY] ,[RecDate] ,[SupplierName] ,[SupplierAccount],[RecStatus] ,[TYPE],[PiDate]  ,[DiscountedDate] ,[Payment]

    UNION
    SELECT null AS [RecDate], Program AS [Program], null AS [Currency], null AS [SupplierName], null AS [SupplierAccount], null AS [RecStatus], null AS [TYPE], null AS [PiDate], null AS [DiscountedDate]
    ,SUM (PaymentAmount) AS [Payment]
    FROM orb_RootRecords
    WHERE FLOOR(CAST(RecDate as float)) = FLOOR(CAST(@runDate as float))
    GROUP BY ROLLUP(Program, Currency)
    ORDER BY [Program]  ,[CURRENCY] ,[RecDate] ,[SupplierName] ,[SupplierAccount],[RecStatus] ,[TYPE],[PiDate]  ,[DiscountedDate] ,[Payment]

Output -
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    56062459.21
NULL    Charles River International Inc NULL    NULL    NULL    NULL    NULL    NULL    NULL    29546.62
2020-05-19 00:00:00.000 Charles River International Inc USD C.H. Robinson Worldwide Inc.    6240000150  Scheduled Discount  Schedule    2020-05-19 00:00:00.000 2020-05-19 00:00:00.000 5025.78
2020-05-19 00:00:00.000 Charles River International Inc USD Life Science Products, Inc  6240000230  Auto Discount   Auto    2020-05-19 00:00:00.000 2020-05-19 00:00:00.000 2626.84
2020-05-19 00:00:00.000 Charles River International Inc USD LR Transport LLC (dba JKL Secure)   6240000130  Auto Discount   Auto    2020-05-19 00:00:00.000 2020-05-19 00:00:00.000 18484.00
2020-05-19 00:00:00.000 Charles River International Inc USD Midwest Filtration LLC  6240000040  Auto Discount   Auto    2020-05-19 00:00:00.000 2020-05-19 00:00:00.000 3410.00
NULL    General Mills Inc   NULL    NULL    NULL    NULL    NULL    NULL    NULL    28651.20
NULL    General Mills Inc   NULL    NULL    NULL    NULL    NULL    NULL    NULL    405646.05
NULL    General Mills Inc   NULL    NULL    NULL    NULL    NULL    NULL    NULL    7467291.72
NULL    General Mills Inc   NULL    NULL    NULL    NULL    NULL    NULL    NULL    7901588.97
2020-05-19 00:00:00.000 General Mills Inc   CAD Aliments Ultima Inc/Ultima Foods    6050001210  Scheduled Discount  Schedule    2020-05-19 00:00:00.000 2020-05-19 00:00:00.000 2004.82

1 Ответ

0 голосов
/ 19 июня 2020

Если я правильно понимаю ваш вопрос, вы выбираете данные и ищете агрегацию (count() или sum()), которая группируется по программе и валюте, а также суммирует общую сумму для каждой программы, как а также общий итог для всех.

Учитывая мой собственный пример данных, данные выглядят так

CATEGORY | CURRENCY | AMOUNT
A        | USD      | 1
A        | USD      | 1
A        | EUR      | 2
A        | EUR      | 2
B        | USD      | 2
B        | EUR      | 3

когда вы запрашиваете свои данные следующим образом

SELECT
    category,
    currency,
    SUM(AMOUNT) sales
FROM
    sales.tablesales
GROUP BY
ROLLUP(category, currency);

результат будет быть

CATEGORY | CURRENCY | AMOUNT
A        | USD      | 2
A        | EUR      | 4
A        | NULL     | 6
B        | USD      | 2
B        | EUR      | 3
B        | NULL     | 5
NULL     | NULL     | 8

Что может быть интерпретировано как

  1. Категория A, нулевая валюта, означает сумму для категории A

  2. Категория B, нулевая валюта, означает общую сумму для категории A

  3. Категория NULL, нулевая валюта, означает общую сумму для всех

...