SQL Server SUM(添加)产品配件的价格

Posted

技术标签:

【中文标题】SQL Server SUM(添加)产品配件的价格【英文标题】:SQL Server SUM (add) prices of accessories to products 【发布时间】:2020-03-25 09:57:42 【问题描述】:

我需要总结主要产品的配件价格。配件和对应产品之间没有联系,但是两个产品之间的所有配件都属于前一个产品(见附注)。

SQL Server 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    |

【问题讨论】:

“配件和对应产品之间没有链接” -- 这需要更改架构并创建此类链接。 【参考方案1】:

我将其理解为一种差距和孤岛问题。您可以使用如下窗口函数来解决它:

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'

最内部的查询使用窗口总和来定义记录组。每次满足产品记录时,都会启动一个新组。中间查询将每个组中的价格相加。最后,最外层的查询只过滤产品记录。

【讨论】:

【参考方案2】:

通过汇总每行之前的产品数量来分配组。然后聚合:

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

【讨论】:

以上是关于SQL Server SUM(添加)产品配件的价格的主要内容,如果未能解决你的问题,请参考以下文章

SQL Sumif 函数/GROUP BY & SUM?

科技公司逐鹿手机配件赛道,“降维打击”会出现吗?

SQL SERVER 开窗函数

LeetCode(数据库)- 每家商店的产品价格

SQL_server中创建订单数据库

无法让 SQL Server 子查询选择所需的结果