2015-04-02 10 views
0

我得到了比較兩條記錄的要求: 我的表是這樣的;從t-sql中只返回列中的數字值

EmpNo payband    ContractType 
123 band 4    permanent 
124 band 4    contract 
125 band 3    permanent 
125 band 4    permanent 
125 band 5 reviewbody permanent 

現在我想過濾重複記錄,我的第一個條件是ContractType ='永久',然後通過高頻過濾。在上表中,EmpNo 125是一名員工,並且我想用高薪酬篩選他的記錄。得到了在payband column

些亂七八糟我想輸出,如:

EmpNo payband ContractType 
123 band 4 permanent 
125 band 5 permanent 

任何幫助嗎?感謝

+0

發佈你想要的輸出? – mohan111 2015-04-02 08:57:22

+0

@ mohan111,已更新謝謝 – GK1960 2015-04-02 08:59:40

+0

我的查詢顯示任何結果給你或任何需要的修改 – mohan111 2015-04-02 09:17:02

回答

0

我已經添加了邏輯,如果沒有數值,那麼任何第一支樂隊會在輸出:

DECLARE @t TABLE 
    (
     EmpNo INT , 
     payband NVARCHAR(MAX) , 
     ContractType NVARCHAR(MAX) 
    ) 

INSERT INTO @t 
VALUES (123, 'band 4', 'permanent'), 
     (124, 'band 4', 'contract'), 
     (125, 'band 3', 'permanent'), 
     (125, 'band 4 review body', 'permanent'), 
     (128, 'band', 'permanent'); 

WITH cte1 
      AS (SELECT EmpNo , 
         payband , 
         ContractType , 
         PATINDEX('%[0-9]%', payband) AS pi , 
         CHARINDEX(' ', payband, PATINDEX('%[0-9]%', payband)) AS ci 
       FROM  @t 
       WHERE ContractType = 'permanent' 
      ), 
     cte2 
      AS (SELECT * , 
         ROW_NUMBER() OVER (PARTITION BY EmpNo ORDER BY CASE 
                   WHEN pi > 0 
                   THEN CAST(SUBSTRING(payband, 
                   pi, ABS(pi - ci)) AS INT) 
                   ELSE 0 
                   END DESC) AS rn 
       FROM  cte1 
      ) 
    SELECT EmpNo , 
      payband , 
      ContractType 
    FROM cte2 
    WHERE rn = 1 

輸出:

EmpNo payband    ContractType 
123  band 4    permanent 
125  band 4 review body permanent 
128  band    permanent 
+0

@ Giorgi Nakeuri,我認爲你的代碼是正確的,但是我在'payband專欄'中弄了一些亂七八糟的評論組織。當我用'樂隊4'代替你的代碼時,emp 125的最後一個唱片變成'樂隊4評論組'。任何幫助? – GK1960 2015-04-02 09:10:54

+0

如果可能的話,您應該糾正您的問題。我的問題。如果我有'第4樂隊審查機構5審查標題'會怎麼樣? – 2015-04-02 09:18:45

+0

更新上面的查詢,在該欄中只有頻段4或頻段5等,沒有提到兩個頻段。謝謝 – GK1960 2015-04-02 09:23:59