组内所有组合的聚合函数

问题描述 投票:0回答:1

我正在尝试为由一列 (package_id) 链接但另一列 (package_item_id) 不匹配的行的所有可能组合生成聚合结果。

我有一个派生表包。请参阅下图中的数据概要:

Packages Table

此结构支持零售网站的打包交易系统:

package_id 与一组可以作为包购买的元素相关。

package_item_id 分解了子元素(根据包的不同,数量也不同),用户可以从中选择variant_ids。

即包装:高级山地自行车,包装物品:车架,款式:蓝色、红色、黄色,包装物品:车轮,款式:窄、宽,包装物品:车座,款式:标准

我正在尝试生成一个聚合 package_id 的每个潜在组合的结果。将 package_id 和variants_ids 连接到查询字符串中并计算分组项目的总价格。数量列决定了为 package_item_id 提供的数量,因此是价格的乘数。此外,我想检查每个变体是否有足够的库存来组成包装 true (1) 或 false (0)

我试图实现的示例结果如下图所示:

Desired Result

我尝试在包 ID 上使用 GROUP BY 只会导致返回一个 package_id,我猜这是预期的,所以我尝试使用窗口函数但没有成功。

到目前为止已经浪费了一天的时间,所以我希望有人能给我指出正确的方向。

数据示例可以在下面的链接中找到:

DBFiddle

sql aggregate-functions window-functions mariadb-10.5
1个回答
0
投票

AFAICT 我们需要为每个

variant_id
生成
package_id
的所有可能组合。由于
package_item_id
的数量不同,这将涉及每个
package_item_id
的自连接。然而,对于不同数量的项目,通常需要动态数量的联接,而 SQL 本身并不支持这一点。

此代码片段可能会实现您正在寻找的结果,但每个

package_item_id
有三个
package_id

SELECT 
  p1.package_id,
  CONCAT('p_id=', p1.package_id, '&v_id=', p1.variant_id, 
         '&v_id=', p2.variant_id, '&v_id=', p3.variant_id) AS querystring,
  (p1.quantity * p1.retail_price + p2.quantity * p2.retail_price + p3.quantity * p3.retail_price) AS total_retail_price,
  (p1.quantity * p1.sell_price + p2.quantity * p2.sell_price + p3.quantity * p3.sell_price) AS total_sell_price,
  CASE 
    WHEN p1.stock_available >= p1.quantity AND p2.stock_available >= p2.quantity AND p3.stock_available >= p3.quantity 
    THEN 1 
    ELSE 0 
  END AS stock_available
FROM packages p1
JOIN packages p2 ON p1.package_id = p2.package_id AND p1.package_item_id <> p2.package_item_id
JOIN packages p3 ON p1.package_id = p3.package_id AND p1.package_item_id <> p3.package_item_id AND p2.package_item_id <> p3.package_item_id
GROUP BY p1.package_id, p1.variant_id, p2.variant_id, p3.variant_id;
© www.soinside.com 2019 - 2024. All rights reserved.