функция windows + раздел hard - PullRequest
0 голосов
/ 07 июня 2019

Мне нужно сделать тот же результат, но не с объединением, а скорее функцией Windows + раздел.выходными данными являются год, идентификатор клиента и отношение прибыли клиента ко всей прибыли за год.

year    Customer_ID    ratio          
2012    2              0.0222
2012    4              0.049
2012    37             0.015
2013    2              0.124


this is the join that work


SELECT a.year, a.Customer_ID, a.profit/b.profit as ratio 
FROM (  select year(order_date) as year, Customer_ID, sum(Profit) as profit 
        from [targil 2].[dbo].[exc2 - orders] 
        group by year(order_date) , Customer_ID
        ) A 
CROSS JOIN (select year(order_date) as year, sum(Profit) as profit
            from [targil 2].[dbo].[exc2 - orders]
            group by year(order_date)) B 
            where a.year = b.year;

1 Ответ

0 голосов
/ 07 июня 2019

Это сложно без примеров данных, но если вы хотите использовать оператор без CROSS JOIN и использовать оконную функцию, следующий оператор может помочь:

SELECT 
    a.[year], 
    a.Customer_ID, 
    a.profit / SUM(a.profit) OVER (PARTITION BY a.[year]) as ratio 
FROM (
    SELECT 
        YEAR(order_date) as [year], 
        Customer_ID, 
        SUM(Profit) as profit 
    FROM [targil 2].[dbo].[exc2 - orders] 
    GROUP BY YEAR(order_date), Customer_ID
) a 

Примечания:

  • Если profit - это столбец int, вам потребуется дополнительный CONVERT.
  • Документация о функции SUM гласит, что ".. order_by_clause требуется ..." , поэтому использование SUM ... OVER ... подобно этому более близко к книгам: SUM(profit) OVER (PARTITION BY [year] ORDER BY (SELECT NULL)) .
...