【问题标题】:IFS and INDEX/ MATCH EXCEL COUNTERPART IN SQL QUERYSQL QUERY 中的 IFS 和 INDEX/ MATCH EXCEL 对应部分
【发布时间】:2016-10-11 03:18:35
【问题描述】:

我的桌子是这样的

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 中的第一个引用应该配对。如果参考编号匹配,则返回值应为 Brand 对应值。

如果引用在Character 中,则它们必须属于 if 语句:IF 字符是非配对返回值应该是唯一的,丢弃表示丢弃等等。如果引用为空白,则没有变化。

这可能吗?

非常感谢。

【问题讨论】:

  • 亲爱的,请发布示例输出
  • @Chels - 你能用例子解释一下吗NUMBERS 中的第一个引用应该配对。如果引用编号匹配,返回值应该是 Brand 对应项。
  • @Chels - 如果有多个匹配项怎么办
  • @Chels 我已根据您的要求添加了以下答案...尝试运行它,看看它是否有效...
  • 不要破坏你的帖子。

标签: sql sql-server if-statement case where-clause


【解决方案1】:

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

我没有使用滞后/领先,因为这对中只有两行,因此对行进行编号并将表格连接到自身感觉更快,更容易遵循。

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

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

【讨论】:

  • 嗨,我修改了一些。因为我发现错误命名。命名引用
  • 我可以要求其他更改吗?它对我来说效果很好。第一次运行时我有错字。大声笑但是我需要为 UID、UNIQUE ITEM ID 添加部分查找值。你能帮忙吗?
  • 这是您希望加入整个结果集的附加表吗?如果是这样,您可以将最终的联合集包装为新的 cte,然后如果您不希望每一行都有结果,则使用左连接将该 cte 的结果连接到您的查找表。你能扩展你的要求吗?
  • @edward,对不起,你能指导我吗?这就像我第一次使用 sql :(((你能帮我解决我的另一个问题吗?非常感谢
  • 嗨,爱德华。我已经投票了。但它说,声望低于 15 的人被计算在内,但不能更改公开显示的投票。
【解决方案2】:
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
     ); 

【讨论】:

  • 感谢@teja,如果它对我有用,我现在就试试这个!非常感谢
  • 公式的滞后和前导部分有错误,请您帮忙
  • 第一个案例得到帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多