2016-10-11 164 views
0

我的表看起來像這樣IFS和INDEX/MATCH EXCEL對應SQL查詢

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字符是Nonpaired返回值應該是唯一的,爲刪除而丟棄等等。如果參考文獻沒有變化,則爲空白。

這可能嗎?

非常感謝。

+0

請張貼樣本輸出親愛 – Teja

+0

@Teja - 評論欄是期望輸出 –

+0

ü可以清除我的邏輯...ü要如何獲得評論欄.. – Teja

回答

1

您可以使用公用表表達式來分解可幫助維護代碼的問題。

我沒有使用lag/lead,因爲你只有兩行,所以對行進行編號並將表格連接到自己感覺更快,更容易遵循。

下面是我用來回答和測試你的問題的代碼;

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 
+0

嗨,我remodified一些吧。因爲我發現錯誤命名。命名refences – Chels

+1

我能問其他更改?IT完美工作很適合我。我曾與第一次運行錯字。LOL不過,我需要補充局部查找UID的值,唯一項目ID。你能協助嗎? – Chels

+0

這是您希望加入整個結果集的附加表嗎?如果是的話你可以用最後一組工會作爲一種新的熱膨脹係數,然後加入該CTE的結果一次與左您的查找表連接,如果你不希望每一行的結果。你可以擴展你的問題嗎? –

1
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 
    ); 
+0

感謝@teja我會嘗試這個現在如果我的作品!不勝感謝 – Chels

+0

可以youplease協助有式 – Chels

+0

的滯後和引線部分錯誤喜第一幫助時情況。 – Chels