Рассчитать процент по отношению к итогу для указанного условия (SQL Server) - PullRequest
0 голосов
/ 28 января 2019

Я работаю над запросом, который должен вернуть набор данных, который будет использоваться отчетом.Предположим, у меня есть таблица dbo.payments с данными, как показано ниже:

-----------------------------------------------
Customer |Commission| Trade Date | Trade Type | 
-----------------------------------------------
AMIRALIS | 20.00    | 22/01/2018 |   SALE     |
BRUSSASH | 30.00    | 22/01/2018 |  PURCHASE  |
AMIRALIS | 10.00    | 22/01/2018 |   SALE     |
AKBMOBIL | 50.00    | 22/01/2018 |  PURCHASE  |
AMIRALIS | 10.00    | 23/01/2018 |  PURCHASE  |
BRUSSASH | 10.00    | 23/01/2018 |  PURCHASE  |
BRUSSASH | 30.00    | 23/01/2018 |   SALE     |
BRUSSASH | 10.00    | 23/01/2018 |  PURCHASE  |
AMIRALIS | 60.00    | 24/01/2018 |  PURCHASE  |
BRUSSASH | 10.00    | 24/01/2018 |   SALE     |

Сценарий # 1: Я хочу написать запрос, который даст мне результаты, как показано ниже.Пожалуйста, обратите внимание, что процентное соотношение не соответствует SUM(Commission) всех времен 240.00 независимо от предложения where.

-----------------------------------------------------
Customer |Total Commission| Trade Date |%Commission | 
-----------------------------------------------------
AMIRALIS |     30.00      | 22/01/2018 |  0.125     |
BRUSSASH |     30.00      | 22/01/2018 |  0.125     |
AKBMOBIL |     50.00      | 22/01/2018 |  0.208     |
AMIRALIS |     10.00      | 23/01/2018 |  0.041     |
BRUSSASH |     50.00      | 23/01/2018 |  0.208     |
AMIRALIS |     60.00      | 24/01/2018 |  0.250     |
BRUSSASH |     10.00      | 24/01/2018 |  0.041     |

Я новичок в SQL, самое дальнее, на что я мог пойти:.

SELECT [TRADE DATE] AS DATE, CUSTOMER, SUM([COMMISSION]) AS TOTAL, ([COMMISSION] / (SELECT SUM([COMMISSION]) FROM DBO.PAYMENTS)) AS '%COMMISSION' FROM DBO.PAYMENTS GROUP BY [TRADE DATE], CUSTOMER, COMMISSION

Как мне достичь желаемого результата, независимо от условия WHERE: то есть WHERE [Trade Date] BETWEEN '21/01/2018' AND '24/01/2018', который уменьшает общее количество до 170.00

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Эту проблему можно решить с помощью оконных функций SQL Server, например:

SELECT DISTINCT
    t.Customer,
    SUM(t.Commission) OVER (PARTITION BY Customer, Trade_Date) Total_Commission,
    t.Trade_Date,
     SUM(t.Commission) OVER (PARTITION BY Customer, Trade_Date) / SUM(t.Commission) OVER() "%Commission"
FROM mytable t 
ORDER BY 1, 3

Демонстрация на скрипте БД :

 Customer | Total_Commission | Trade_Date          | %Commission
 :------- | :--------------- | :------------------ | :----------
 AKBMOBIL | 50.00            | 22/01/2018 00:00:00 | 0.208333   
 AMIRALIS | 30.00            | 22/01/2018 00:00:00 | 0.125000   
 AMIRALIS | 10.00            | 23/01/2018 00:00:00 | 0.041666   
 AMIRALIS | 60.00            | 24/01/2018 00:00:00 | 0.250000   
 BRUSSASH | 30.00            | 22/01/2018 00:00:00 | 0.125000   
 BRUSSASH | 50.00            | 23/01/2018 00:00:00 | 0.208333   
 BRUSSASH | 10.00            | 24/01/2018 00:00:00 | 0.041666   

PS: если вам нужно отфильтровать вывод по дате, вы можете просто добавить к запросу предложение WHERE.Это отфильтрует оба вычисления.

0 голосов
/ 28 января 2019

Вы можете использовать запрос агрегации.В этом случае вы можете использовать оконную функцию для расчета общей комиссии:

select Customer, TradeDate,
       sum(Commission) as total_Commission,
       sum(Commission) / sum(sum(Commission)) over () as percent_commission
from dbo.payments p
group by Customer, TradeDate
...