我在MS SQL Server中有两个表。
表A包含客户ID列表以及他们购买的产品。
产品被捆在一起形成一个包装。
表B包含产品组及其形成的包装。
示例:
表A:
CustID Product
-------------------
10001 Mobo_1
10001 GPU_1
10002 Mobo_1
10002 GPU_2
表B:
Product Package
-------------------
Mobo_1 Pack_A
GPU_1 Pack_A
Mobo_1 Pack_B
GPU_2 Pack_B
我想将Package列从表B映射到表A,考虑到特定客户购买的产品的特定组合,
即Mobo_1+GPU_1应当映射到Pack_A并且Mobo_1+TPU_2应当映射到Pack_B。
结果输出:
CustID Product Package
-------------------------------
10001 Mobo_1 Pack_A
10001 GPU_1 Pack_A
10002 Mobo_1 Pack_B
10002 GPU_2 Pack_B
我尝试过搜索LEFT JOIN
+GROUP BY
+WHERE
条件,但似乎找不到任何类似的问题或解决方案。
是的,这是可以做到的,但需要付出一些努力
select a.CustID,
a.Product,
t3.Package
from TableA a
left join ( select t.CustID,
t2.Package
from ( select a.CustID,
( select top 1 string_agg(a.Product, '+')
from TableA a2
where a2.CustID = a.CustID
) as Products
from TableA a
group by a.CustID
) t
left join ( select b.Package,
( select top 1 string_agg(b.Product, '+')
from TableB b2
where b2.Package = b.Package
) as Products
from TableB b
group by b.Package
) t2 on t.Products = t2.Products
) t3 on a.CustID = t3.CustID
结果是
CustID Product Package
10001 Mobo_1 Pack_A
10001 GPU_1 Pack_A
10002 Mobo_1 Pack_B
10002 GPU_2 Pack_B
你可以在这个DBFiddle 上自己试试
编辑
我使用的技巧是将两个表的产品组合成一个varchar('Mobo_1+GPI_1'和'Mobo+1+GPI_2'(,然后您可以使用这些varchar进行连接
当您查看DBFiddle 中的最后一个查询时,会更清楚