mariadb 如何统计所有动态属性的采购订单的匹配销售订单?

pgccezyw  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(158)

我想在一个查询中检索所有的购买订单,并计算匹配的购买订单。匹配将是满足所有属性(大于或等于)并且比购买订单便宜的销售订单。这可能吗?
这是我的表结构:

属性

| 身份证|姓名|
| - ------|- ------|
| 1个|面积(平方米)|
| 第二章|会议室|
| ...|...|

卖出订单

| 身份证|标题|价格|...|
| - ------|- ------|- ------|- ------|
| 1个|1号公寓|50万欧元|...|
| 第二章|1号厂房|1百万欧元|...|
| ...|- -|- -|...|

卖单属性

| 销售订单标识|属性标识|价值|...|
| - ------|- ------|- ------|- ------|
| 1个|1个|九十|...|
| 1个|第二章|三个|...|
| 第二章|1个|二百三十九|...|
| 第二章|第二章|五个|...|
| ...|...|...|...|

购买订单

| 身份证|要约|...|
| - ------|- ------|- ------|
| 1个|600万欧元|...|
| 第二章|150万欧元|...|

采购订单属性

| 购买订单标识|属性标识|价值|...|
| - ------|- ------|- ------|- ------|
| 1个|1个|八十|...|
| 1个|第二章|第二章|...|
| 第二章|1个|二百|...|
| 第二章|第二章|三个|...|
| ...|...|...|...|
我尝试在MySQL Workbench中求解,但无法解出

jv2fixgn

jv2fixgn1#

我假设卖单id和买单id是相关的,如果不是,那么在你的数据中sell和buy表之间就没有关系了。你可以尝试下面这样的方法来得到原始答案。首先cte为所有属性创建标记。其次CTE得到满足所有属性需要的所有sales id。然后final select获取采购订单符合销售属性需求且价格低于采购订单的情况。

with cte as ( 
select s.*
case
        when a.[attribute_id] = 'whatever attribute you choose' and a.value >= 'whatever the benchmark is' then 1
        when a.[attribute_id] = 'whatever 2nd attribute you choose' and a.value >= 'whatever the benchmark is' then 1
            else 0
            end as marker
    from [Sell Orders]  s
        inner join [Sell Order Attributes] a on s.id = a.sell_order_id
),

cte2 as (
select id , sum(marker)
from cte
group by id
having sum(marker) = 2 --however many attributes you are testing
)

select *
    from [Buy Orders] b on b.id = s.id
        inner join [Buy Order Attributes] c on b.id = c.buy_order_id
        inner join  cte2 t on t.id = b.id

        Where  t.price < b.price
u91tlkcl

u91tlkcl2#

因为你不把价格和报价存储为十进制或其他数字类型,所以你总是需要转换它,这将花费一些时间,而且不支持货币数据类型,所以你应该重新设计你的表。
剩下的就是许多带有正确ON子句的连接。
它会将价格与报价以及所有匹配的属性进行比较

SELECT DISTINCT s.*,b.*
FROM Sell_Orders s JOIN Sell_Order_Attributes sa ON sa.`sell_order_id` = s.`id`
JOIN Buy_Orders b ON CAST( REPLACE(REPLACE(REPLACE(b.`offer`,'€',''),'.',''),',','.') AS DECIMAL(20,2))  >= CAST( REPLACE(REPLACE(REPLACE(s.price,'€',''),'.',''),',','.') AS DECIMAL(20,2))  JOIN Buy_Order_Attributes ba ON ba.`buy_order_id` = b.`id` 
  and ba.`attribute_id` = sa.`attribute_id`and sa.`value` >= ba.`value`

| 身份证|标题|价格|身份证|要约|
| - ------|- ------|- ------|- ------|- ------|
| 1个|1号公寓|50万欧元|1个|600万欧元|
fiddle

相关问题