Суммирование продаж по разным годам - PullRequest
0 голосов
/ 18 марта 2020
    | Product ID | YearBought | Sales | Min_Year | Max_Year |
    |      1     |    2016    |  $20  |   2011   |   2016   |
    |      2     |    2016    |  $10  |   2016   |   2018   |
    |      2     |    2017    |  $30  |   2016   |   2018   |
    |      3     |    2017    |  $5   |   2015   |   2019   |
    |      3     |    2018    |  $10  |   2015   |   2019   |
    |      3     |    2018    |  $20  |   2015   |   2019   |
    |      3     |    2019    |  $5   |   2015   |   2019   |
    |      3     |    2019    |  $30  |   2015   |   2019   |
    |      4     |    2018    |  $5   |   2018   |   2020   |
    |      4     |    2019    |  $10  |   2018   |   2020   |
    |      4     |    2020    |  $20  |   2018   |   2020   |

Min_Year = год, в который продукт был впервые представлен

Max_Year + 1 = год выпуска продукта

Выше приведен пример таблицы, с которой я работаю. Попытка найти:

  • сумму продаж новых продуктов, принесенных в том году, когда они были впервые представлены

  • сумма "упавших продаж", или сумма продаж товаров через год после того, как они выпали (продаж не было). (Например, продукт принес 15 долларов в 2018 году, но не имел продаж в 2019 году, хочу показать 15 долларов как падение продаж в 2019 году)

Ожидаемый объем производства:

    |     YearBought   | New Product Sales | Dropped Product Sales | 
    |      2016        |        $10        |                       | 
    |      2017        |                   |           $20         |  
    |      2018        |         $5        |                       |  
    |      2019        |                   |                       |  
    |      2020        |                   |           $35         |   

думал что-то вроде этого, но это не работает. любая помощь будет оценена!

select 
    YearBought,
    sum(case when yearbought=min_year then sales else 0 end) as NewSales,
    sum(case when yearbought=max_year+1 then sales else 0 end) as DropSales
from 
    #t 
group by 
    yearbought    

Ответы [ 3 ]

0 голосов
/ 18 марта 2020

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

with

    droppedProds as (

        select      droppedYear = yearBought + 1, 
                    foregoneSales = sum(sales)
        from        @t t 
        where       YearBought = Max_Year
        group by    YearBought

    ),

    newSales as (

        select      YearBought,
                    sales = sum(sales),
                    newSales = sum(case when yearBought = min_year then sales end)
        from        @t t
        group by    YearBought

    )

    select      YearBought,
                n.sales,
                n.newSales,
                d.foregoneSales
    from        newSales n
    left join   droppedProds d on n.yearBought = d.droppedYear
    order by    YearBought;

Результаты в:

+------------+-------+----------+---------------+
| YearBought | sales | newSales | foregoneSales |
|------------|-------|----------|---------------|
|    2016    |  30   |    10    |               |  
|    2017    |  35   |          |      20       |  
|    2018    |  35   |     5    |               |  
|    2019    |  45   |          |               |  
|    2020    |  20   |          |      35       |
+------------+-------+----------+---------------+
0 голосов
/ 19 марта 2020

Я думаю, что ваша проблема в том, что годы в шахматном порядке.

with n as (
    select year_bought as y, sum(sales) as sales,
        sum(case when year_bought = min_year then sales end) as ns
    from T group by year_bought
), d as (
    select year_bought + 1 as y,
        sum(case when year_bought = max_year then sales end) as ds
    from T group by year_bought
)
select y, sales,
    ns as newSales, coalesce(dropped, 0) as foregoneSales
from n left outer join p on p.y = n.y;

или используйте lead()

select year_bought, sum(Sales) as Sales,
    sum(case when year_bought = min_year then sales end) as newSales,
    coalesce(lead(sum(case when year_bought = max_year then sales end))
        over (order by year_bought), 0) as foregoneSales
from T
group by year_bought;
0 голосов
/ 18 марта 2020

Вы можете сначала перечислить даты, затем объединить их с исходной таблицей и выполнить условное агрегирование:

select
    y.yearbought,
    sum(case when t.yearbought = t.min_year then sales end) new_product_sales,
    sum(case when t.yearbought = t.max_year then sales end) dropped_product_sales
from (select distinct yearbought from #t) y
inner join #t on y.yearbought in (t.min_year, t.max_year + 1)
group by y.yearbought
...