仅在存在多个匹配项时才包含条件

问题描述 投票:0回答:1

我试图从 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'|
sql join left-join case
1个回答
0
投票

我建议您将串联的辅助数据分解成行,同时计算行号,以便避免结果中的重复,例如

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.