sql-server - 使用 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
解决方案
你可以简单地做到这一点。创建 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
推荐阅读
- git - Does the direction or order of a merge/rebase make a difference?
- c# - c# HttpWebRequest 不反映 vpn 位置变化
- lua - 本地转换=string.char
- c# - Entity Framework Core - Generically assign dynamic values to common columns in code first
- java - 如何通过指定类而不是 jar 来加载代理
- java - 如何在 Spring Boot 应用程序中使用多个 mongodb 数据库?
- parsing - Convert String into exact same Int
- c# - 如何检查 customLogs 是否正在上传到 Azure Application Insights
- excel - 根据值更改散点图excel中特定点的形状
- php - 如何使用ffmpeg将具有过渡效果的文本添加到视频中?