首页 > 解决方案 > 使用 SQL 分发记录

问题描述

如何正确分配每个站点的 SKU。无论有没有数量,所有站点都必须有 SKUS。请参考下表

DocNos  SKU  SiteCode  Site         Qty
2222    AAA  001       Eastwood      1
2222    BBB  002       Holywood      2
2222    BBB  003       Baywood       1
2222    CCC  004       RiverBank     3
2222    AAA  004       RiverBank     3

在站点 Eastwood 上的示例中,此站点上仅分配了 SKU AAA,但是我们需要在此站点上包括其他 SKU(BBB、CCC),但仅分配 0。

期望的输出

DocNos  SKU  SiteCode  Site         Qty
2222    AAA  001       Eastwood      1
2222    BBB  001       Eastwood      0
2222    CCC  001       Eastwood      0
2222    BBB  002       Holywood      2
2222    AAA  002       Holywood      0
2222    CCC  002       Holywood      0
2222    BBB  003       Baywood       1
2222    AAA  003       Baywood       0
2222    CCC  003       Baywood       0
2222    CCC  004       RiverBank     3
2222    AAA  004       RiverBank     3
2222    BBB  004       RiverBank     0

标签: sql-server

解决方案


你可以简单地做到这一点。创建 CTE,然后交叉连接和左连接:

测试数据:

create table test(docnos int, SKU varchar(3), sitecode varchar(3), site varchar(20), qty int);
insert into test values (2222, 'AAA', '001', 'Eastwood', 1);
insert into test values (2222, 'BBB', '002', 'Holywood', 2);
insert into test values (2222, 'BBB', '003', 'Baywood', 1);
insert into test values (2222, 'CCC', '004', 'RiverBank', 3);
insert into test values (2222, 'AAA', '004', 'RiverBank', 3);

with cteUniqueSKU (SKU) as (select distinct sku from test),
cteUniqueSite(Sitecode) as (select distinct sitecode from test),
cteCounts (docnos, site, qty, sku, sitecode) as (select docnos, site, qty, sku, sitecode from test)

select c.docnos, t.SKU, g.sitecode, c.site, coalesce (c.qty, 0)
from cteUniqueSKU as t cross join cteUniqueSite as g
left join cteCounts as c on c.sitecode = g.sitecode and c.sku = t.sku

推荐阅读