IFS 和 INDEX/ MATCH EXCEL COUNTERPART IN SQL QUERY

IFS and INDEX/ MATCH EXCEL COUNTERPART IN SQL QUERY

我的table看起来像这样

NAME        BRAND    REFERENCE       COMMENTS   <-Expected output
-------------------------------------------------
Gu          Skirt    101128           Pants
Cci         Pants    101127           Pants
Cha         Skirt    paired           paired
Gu          Pants    101128           Skirts
Nel         Skirt    nonpaired        UNIQUE
Gir         Pants    101188           Skirt
Baud        Skirt    dropped          DROPPED
Le          Pants    paired           PAIRED 
Gir         Skirt    101188           101178 
Vis         Socks                     blanks
Cci         Skirts   101127           Skirts

我想知道使用什么代码来获得 Comments 结果。

NUMBERS 中的第一个参考文献应该配对。如果参考编号匹配,return 值应为 Brand 对应值。

如果引用在 Character 中,它们必须属于 if 语句:如果字符不成对 return 值应该是唯一的,为丢弃而丢弃等等。如果参考文献是空白,则没有变化。

这可能吗?

非常感谢。

SELECT Name,
       Brand,
       Reference,
       CASE WHEN Reference = 'Paired' THEN 'Paired' 
            WHEN Reference = 'nonpaired' THEN 'Unique'
            WHEN Reference = 'dropped' THEN 'DROPPED'
            WHEN Reference = ' ' THEN 'blanks'
            WHEN Reference = Next_Ref AND rownum = 1 THEN next_brand
            WHEN Reference = Prev_Ref AND rownum = 2 THEN prev_brand
        END AS Comments
  FROM  
     (
       SELECT Name,
              Brand,
              Reference,
              LAG( Reference, 1 )OVER PARTITION BY ( Reference ORDER BY Brand ) AS Prev_Ref,
              LEAD( Reference, 1 )OVER PARTITION BY ( Reference ORDER BY Brand ) AS Next_Ref,
              LAG( Brand, 1 ) OVER PARTITION BY ( Reference ORDER BY Brand ) AS Prev_Brand,
              LEAD( Brand, 1 ) OVER PARTITION BY ( Reference ORDER BY Brand ) AS Next_Brand,
              ROW_NUMBER( ) OVER PARTITION BY ( Reference ORDER BY Brand ) AS rownum
         FROM Data
     ); 

您可以使用常见的 table 表达式来分解问题,这有助于维护代码。

我没有使用 lag/lead,因为你只有两行,所以对行进行编号并将 table 加入到自身中感觉更快更容易理解。

这是我用来回答和测试你的问题的代码;

create table #source
(
    [NAME] varchar(200),
    [BRAND] varchar(200),
    [REFERENCE] varchar(200)
);

insert into #source values
    ('Gu','Skirt','101128'),
    ('Cci','Pants','101127'),
    ('Cha','Skirt','paired'),
    ('Gu','Pants','101128'),
    ('Nel','Skirt','nonpaired'),
    ('Gir','Pants','101188'),
    ('Baud','Skirt','dropped'),
    ('Le','Pants','paired'),
    ('Gir','Skirt','101188'),
    ('Vis','Socks',''),
    ('Cci','Skirts','101127'),
    ('Le','Socks','101188'),
    ('Uno','Socks','101101');

select * from #source;

with cteNumericRef as
(
    select [NAME],[BRAND],[REFERENCE]
    from #source
    where ISNUMERIC([REFERENCE]) = 1
)

, cteCheckRow as
(
    select [REFERENCE],
        'CHECK' as [COMMENT]
    from cteNumericRef
    group by [REFERENCE]
    having count(*) <> 2
)

, ctePairedRow as
(
    select
          num_ref.[NAME]
        , num_ref.[BRAND]
        , num_ref.[REFERENCE]
        , row_number() over (partition by num_ref.[REFERENCE] order by num_ref.[NAME]) as [Pair_Num]

    from cteNumericRef num_ref

    left join cteCheckRow check_row
        on check_row.[REFERENCE] = num_ref.[REFERENCE]

    where check_row.[REFERENCE] is null
)

, cteTextRow as
(
    select [NAME],[BRAND],[REFERENCE],
        case [REFERENCE]
            when 'paired' then 'PAIRED'
            when 'nonpaired' then 'UNIQUE'
            when 'dropped' then 'DROPPED'
            when '' then ''
        else 'CHECK' end as [COMMENT]
    from #source
    where ISNUMERIC([REFERENCE]) <> 1
)

select
    left_row.[NAME]
    , left_row.[BRAND]
    , left_row.[REFERENCE]
    , right_row.[BRAND] as [COMMENTS]
from ctePairedRow left_row
inner join ctePairedRow right_row
    on left_row.[REFERENCE] = right_row.[REFERENCE]
    and left_row.[Pair_Num] <> right_row.[Pair_Num]

union all

select
    num_ref.[NAME]
    , num_ref.[BRAND]
    , num_ref.[REFERENCE]
    , check_row.[COMMENT]
from cteNumericRef num_ref
inner join cteCheckRow check_row
    on check_row.[REFERENCE] = num_ref.[REFERENCE]

union all

select
      [NAME]
    , [BRAND]
    , [REFERENCE]
    , [COMMENT]
from cteTextRow;


drop table #source