我试图从 merged_products 表中获取 pID,在很多情况下,厚度、宽度、等级和长度与十几条或更多记录匹配,唯一的区别是其中一条将包含 AID。
我只需要在有不止一场比赛时包含 AID,但我不知道如何实现这一点。
CREATE TABLE #raw_customer (
[DECIMAL] decimal(20, 4),
[WIDTH] decimal(20, 4),
[LENGTH] decimal(20, 4),
[SAE] varchar(10),
[CURR MNBR] varchar(255),
[AID] varchar(255)
)
CREATE TABLE #merged_products (
[pID] int,
[Thickness] decimal(20, 4),
[Width] decimal(20, 4),
[Length] decimal(20, 4),
[Grade] varchar(10),
[MNumber] varchar(255),
[Config] varchar(255),
[AID] varchar(255)
)
INSERT INTO #raw_customer VALUES
(0.299, 48, 100, 'XB0', NULL, ''),
(0.3, 60, 120, 'XB0', 'M723087', ''),
(0.25, 48, 140, 'GR1', 'M701283', '906008314'),
(0.25, 60, 140, 'Y45', NULL, '008008314'),
(0.125, 72, 205, 'GR7', 'M712390', '005003468')
INSERT INTO #merged_products VALUES
(1, 0.2990, 48.0000, 100.0000, 'XB0', NULL, 'Stock', ''),
(2, 0.3000, 60.0000, 120.0000, 'XB0', NULL, 'Stock', ''),
(3, 0.2500, 48.0000, 140.0000, 'GR1', 'M701283', 'Stock', ''),
(4, 0.2500, 60.0000, 140.0000, 'Y45', NULL, 'Raced', ''),
(5, 0.1250, 72.0000, 205.0000, 'GR7', 'M712390', 'Raced', '900751488; 006008314; '),
(6, 0.1250, 72.0000, 205.0000, 'GR7', 'M712390', 'Raced', '005003468; 006025951; 006022051')
SELECT
mp.[pID],
r.[DECIMAL], mp.[Thickness],
r.[WIDTH], mp.[Width],
r.[LENGTH], mp.[Length],
r.[SAE], mp.[Grade],
mp.[Config],
r.[CURR MNBR], mp.[MNumber],
r.[AID], mp.[AID]
FROM #raw_customer r
LEFT JOIN #merged_products mp ON
CAST(r.[DECIMAL] AS decimal(20,4)) = CAST(mp.[Thickness] AS decimal(20,4)) AND
CAST(r.[WIDTH] AS decimal(20,4)) = CAST(mp.[Width] AS decimal(20,4)) AND
CAST(r.[LENGTH] AS decimal(20,4)) = CAST(mp.[Length] AS decimal(20,4)) AND
(
(
r.[CURR MNBR] IS NULL AND mp.[Config] = 'Stock'
) OR (
r.[CURR MNBR] IS NOT NULL AND r.[CURR MNBR] IN ( SELECT value FROM STRING_SPLIT(mp.[MNumber],','))
)
) AND
r.[AID] = (
CASE
WHEN r.[AID] IN ( SELECT value FROM STRING_SPLIT(mp.[AID],',') ) THEN ( SELECT value FROM STRING_SPLIT(mp.[AID],',') )
ELSE '' -- r.[AID] would need to match any value if not found in mp.[AID]. r.[AID] does have NULL values
END ) AND
r.[SAE] = mp.[Grade]
GROUP BY
mp.[pID], mp.[Thickness], mp.[Width], mp.[Length], mp.[Grade], mp.[MNumber], mp.[Config], mp.[AID],
r.[DECIMAL], r.[WIDTH], r.[LENGTH], r.[SAE], r.[CURR MNBR], r.[AID]
ORDER BY r.[AID]
这是我正在寻找的结果,特别是最后一个结果,它只从#5或#6中选择#6
|pID |DECIMAL|Thickness|WIDTH|Width |LENGTH| Length |SAE |Grade |Config |CURR MNBR |MNumber |AID |AID
|1 | 0.299 | 0.2990| 48 | 48.0000| 100 | 100.0000 | 'XB0' | 'XB0' | 'Stock'|NULL |NULL | '' |NULL|
|2 | 0.3 | 0.3000| 60 | 60.0000| 120 | 120.0000 | 'XB0' | 'XB0' | 'Stock'|'M723087' |NULL | '' |NULL|
|3 | 0.25 | 0.2500| 48 | 48.0000| 140 | 140.0000 | 'GR1' | 'GR1' | 'Stock'|'M701283' |'M701283'| '906008314' |NULL|
|4 | 0.25 | 0.2500| 60 | 60.0000| 140 | 140.0000 | 'Y45' | 'Y45' | 'Raced'|NULL |NULL | '008008314' |NULL|
|6 | 0.125 | 0.1250| 72 | 72.0000| 205 | 205.0000 | 'GR7' | 'GR7' | 'Raced'|'M712390' |'M712390'| '005003468' |'005003468; 006025951; 006022051'|
我建议您将串联的辅助数据分解成行,同时计算行号,以便避免结果中的重复,例如
SELECT p.pID,Thickness,Width,Length,Grade,MNumber,Config, aid as xaid
, trim(s.value) AS AID
, coalesce(trim(nullif(s.value,' ')),'999999999')
, row_number() OVER (
PARTITION BY MNumber, Thickness, Width, Length, Grade
ORDER BY coalesce(trim(nullif(s.value,' ')),'999999999') ASC
) AS rn
FROM #merged_products AS p
OUTER APPLY STRING_SPLIT(case when p.aid <> ' ' then concat(';',p.AID) end, ';') AS s
pID | 厚度 | 宽度 | 长度 | 等级 | M号码 | 配置 | xaid | 援助 | (无栏名) | rn |
---|---|---|---|---|---|---|---|---|---|---|
4 | 0.2500 | 60.0000 | 140.0000 | Y45 | 空 | 比赛 | 空 | 999999999 | 1 | |
1 | 0.2990 | 48.0000 | 100.0000 | XB0 | 空 | 库存 | 空 | 999999999 | 1 | |
2 | 0.3000 | 60.0000 | 120.0000 | XB0 | 空 | 库存 | 空 | 999999999 | 1 | |
3 | 0.2500 | 48.0000 | 140.0000 | GR1 | M701283 | 库存 | 空 | 999999999 | 1 | |
6 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 005003468; 006025951; 006022051 | 005003468 | 005003468 | 1 |
5 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 900751488; 006008314; | 006008314 | 006008314 | 2 |
6 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 005003468; 006025951; 006022051 | 006022051 | 006022051 | 3 |
6 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 005003468; 006025951; 006022051 | 006025951 | 006025951 | 4 |
5 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 900751488; 006008314; | 900751488 | 900751488 | 5 |
5 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 900751488; 006008314; | 999999999 | 6 | |
6 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 005003468; 006025951; 006022051 | 999999999 | 7 | |
5 | 0.1250 | 72.0000 | 205.0000 | GR7 | M712390 | 比赛 | 900751488; 006008314; | 999999999 | 8 |
一旦获得此结果,我们就可以将其用作整体简化查询中的子查询:
SELECT mp.[pID]
, r.[DECIMAL]
, mp.[Thickness]
, r.[WIDTH]
, mp.[Width]
, r.[LENGTH]
, mp.[Length]
, r.[SAE]
, mp.[Grade]
, mp.[Config]
, r.[CURR MNBR]
, mp.[MNumber]
, r.[AID]
, mp.[AID]
FROM #raw_customer r
LEFT JOIN (
SELECT
p.pID,Thickness, Width, Length, Grade, MNumber, Config, aid
, trim(s.value) AS XAID
, row_number() OVER (
PARTITION BY MNumber, Thickness, Width, Length, Grade
ORDER BY coalesce(trim(nullif(s.value,' ')),'999999999') ASC
) AS rn
FROM #merged_products AS p
OUTER APPLY STRING_SPLIT(case when p.aid <> ' ' then concat(';',p.AID) end, ';') AS s
) mp ON r.[DECIMAL] = mp.[Thickness]
AND r.[WIDTH] = mp.[Width]
AND r.[LENGTH] = mp.[Length]
pID | 十进制 | 厚度 | 宽度 | 宽度 | 长度 | 长度 | 美国汽车工程师协会 | 等级 | 配置 | 当前 MNBR | M号码 | 援助 | 援助 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0.2990 | 0.2990 | 48.0000 | 48.0000 | 100.0000 | 100.0000 | XB0 | XB0 | 库存 | 空 | 空 | ||
2 | 0.3000 | 0.3000 | 60.0000 | 60.0000 | 120.0000 | 120.0000 | XB0 | XB0 | 库存 | M723087 | 空 | ||
3 | 0.2500 | 0.2500 | 48.0000 | 48.0000 | 140.0000 | 140.0000 | GR1 | GR1 | 库存 | M701283 | M701283 | 906008314 | |
4 | 0.2500 | 0.2500 | 60.0000 | 60.0000 | 140.0000 | 140.0000 | Y45 | Y45 | 比赛 | 空 | 空 | 008008314 | |
6 | 0.1250 | 0.1250 | 72.0000 | 72.0000 | 205.0000 | 205.0000 | GR7 | GR7 | 比赛 | M712390 | M712390 | 005003468 | 005003468; 006025951; 006022051 |