SQL Сервер СУММ (добавить) цены на комплектующие к товарам - PullRequest
0 голосов
/ 25 марта 2020

Мне нужно подвести цены на комплектующие к основному товару. Нет никакой связи между аксессуарами и соответствующим продуктом, однако все аксессуары между двумя продуктами относятся к предыдущему продукту (см. Примечание).

SQL Сервер 2017

Ввод:

| No | Order | Type      | ProdNo | Price |     side note
--------------------------------------
|  1 | 20213 | Product   | 1320   | 200   |     + 0 + 20
|  2 | 20213 | Accessory | 823    | 0     |     acc. of 1320
|  3 | 20213 | Accessory | 836    | 20    |     acc. of 1320
|  4 | 20213 | Product   | 2680   | 300   |     + 0 + 0 + 0 + 0
|  5 | 20213 | Accessory | 231    | 0     |     acc. of 2680
|  6 | 20213 | Accessory | 536    | 0     |     acc. of 2680
|  7 | 20213 | Accessory | 23     | 0     |     acc. of 2680
|  8 | 20213 | Accessory | 361    | 0     |     acc. of 2680
|  9 | 20213 | Product   | 3320   | 50    |     + 10 + 15
| 10 | 20213 | Accessory | 328    | 10    |     acc. of 3320 
| 11 | 20213 | Accessory | 369    | 15    |     acc. of 3320

Вывод:

| No | Order | Type      | ProdNo | Price |  
--------------------------------------
|  1 | 20213 | Product   | 1320   | 220   |
|  4 | 20213 | Product   | 2680   | 300   |
|  9 | 20213 | Product   | 3320   | 75    |

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Назначьте группы, суммируя количество продуктов перед каждой строкой. Тогда совокупность:

select order, 'Product' as type, 
       max(case when type = 'Product' then prodno end) as prodno,
       sum(price)
from (select t.*,
             sum(case when type = 'Product' then 1 else 0 end) over (partition by order order by no) as grp
      from t
     ) t
group by grp, order
2 голосов
/ 25 марта 2020

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

select *
from (
    select no, order, type, prodNo, sum(price) over(partition by grp) price
    from (
        select
            t.*, 
            sum(case when type = 'Product' then 1 else 0 end) 
                over(partition by orderNo order by no) grp
        from mytable t
    ) t
) t
where type = 'Product'

Самый внутренний запрос использует сумму окон для определения групп записей. Каждый раз, когда встречается запись о продукте, начинается новая группа. Промежуточный запрос суммирует цены в каждой группе. Наконец, самые внешние запросы фильтруют только записи о продуктах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...