订单中的所有捆绑商品(订单商品列表)

时间:2020-10-09 16:17:48

标签: sql sql-server tsql

我的任务是对产品包进行逆向工程。

我们有2个套装,一个带有3个商品,一个带有4个商品。

示例:

捆绑表

SKU 1      Bundle 1
SKU 2      Bundle 1
SKU 3      Bundle 1
SKU 4      Bundle 1
SKU 5      Bundle 2
SKU 6      Bundle 2
SKU 7      Bundle 2
SKU 8      Bundle 2
SKU 9      Bundle 2

我需要找到所有捆绑产品中具有相应SKU的每个订单。

我可以轻松进行硬编码,但这不是最好的方法...

select 'BUNDLE 1'
from dbo.[Order] o
where exists (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU1')
and exists   (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU2')
and exists   (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU3')
and exists   (select 1 from dl.OrderItem ol where ol.Order_ID = o.Order_ID and ol.SKUVariant = 'SKU4')

有没有办法动态地比较数据集?

预先感谢您提供此信息,让我知道您是否还有想要的信息。

3 个答案:

答案 0 :(得分:0)

似乎您正在寻找类似的东西

with
bundles_cte(SKUVariant, BundleNum) as (
    select * from (values ('SKU1', 1), ('SKU2', 1), ('SKU3', 1),
                          ('SKU4', 1), ('SKU5', 2), ('SKU6', 2),
                          ('SKU7', 2), ('SKU8', 2), ('SKU9', 2)),
bundles_sum_cte(BundleNum, ItemCount) as (
    select BundleNum, count(*) from bundles_cte group by BundleNum),
orders_cte(Order_ID, BundleNum, ItemCount) as (
    Select o.Order_ID, bc.BundleNum, count(distinct bc.SKUVariant)
    from dbo.[Order] o 
         join dbo.OrderItem oi on o.Order_id=oi.Order_id
         join bundles_cte bc on oi.SKUVariant=bc.SKUVariant
    group by o.Order_ID, bc.BundleNum)
select o.*
from orders_cte o
where exists(select 1 
             from bundles_sum_cte bsc
             where bsc.BundleNum=o.BundleNum
                   and bsc.ItemCount=o.ItemCount);

答案 1 :(得分:0)

我认为您的答案是这样的。 而且我以为您的捆绑包表的名称类似于“ dbo.BundlesTable”

select 'Bundle 1'
from dbo.[order] o
where not exists 
((select SKU 
from dbo.BundlesTable 
where Bundle = 'Bundle 1') 
except
(select SKUVariant 
from dl.OrderItem ol 
where ol.Order_ID = o.Order_ID))

答案 2 :(得分:0)

感谢您的答复。我也无法应用它们,因为它们也是硬编码的。

最后,我开发了一个游标,以提供所需的文本,该文本根据原始查询动态计算更新语句。然后使用光标输出中的变量对每个包进行更新。

从性能的角度来看,合适的游标并不是很好,但是我似乎已经用尽了所有的选择。

再次感谢