2016-09-22 33 views
-4

我想對他們。我很低於格式從字符串中提取月份名稱和年份在SQL服務器和樞軸他們

Id | Reason 
123 | Post-Close QC Audit - December 2015 
124 | Pre Fund Fraud Prevention 
125 | Post-Close QC Audit - November 2015 
126 | Post-Close QC Audit - October 2016 
127 | Post-Close QC Audit - November 
128 | Post-Close QC Audit - December 2015 

我在數據從SQL服務器和樞軸字符串中提取月份名稱和年份需要從這兩個結果集。 一個是所有的有效日期和年份 實例:在格式

原因

December 2015 
November 2015 
October 2016 

和第二輸出

December 2015 | November 2015 | October 2016 
123 | 125 | 126 
128 | NULL | NULL 
+1

請張貼你的查詢和你得到的錯誤。 –

+0

你需要一個'REVERSE','CHARINDEX','SUBSTRING'和'PIVOT' – NEER

回答

0

這裏是解決這個的一種方法:

-- Your sample data 
DECLARE @table TABLE (ID int, Reason varchar(100)); 
INSERT @table 
VALUES 
(123, 'Post-Close QC Audit - December 2015'), 
(124, 'Pre Fund Fraud Prevention'), 
(125, 'Post-Close QC Audit - November 2015'), 
(126, 'Post-Close QC Audit - October 2016'), 
(127, 'Post-Close QC Audit - November'), 
(128, 'Post-Close QC Audit - December 2015'); 

-- solution 
WITH DateExtract AS 
(
    SELECT ID, Reason, Mo = 
    SUBSTRING 
    (
     Reason, start, PATINDEX('% [0-9][0-9][0-9][0-9]%', SUBSTRING(Reason,start,8000))+5 
    ) 
    FROM 
    (
    SELECT 
     ID, Reason, start = NULLIF(MAX(PATINDEX('%'+Mo+'% [0-9][0-9][0-9][0-9]%', Reason)),0) 
    FROM @table 
    CROSS JOIN 
    (VALUES ('January'),('February'),('March'),('April'),('May'),('June'),('July'), 
      ('August'),('September'),('October'),('November'),('December')) M(Mo) 
    GROUP BY ID, Reason 
) prep 
), 
DateMatrix AS 
(
    SELECT 
    [December 2015] = MAX(CASE Mo WHEN 'December 2015' THEN ID END), 
    [November 2015] = MAX(CASE Mo WHEN 'November 2015' THEN ID END), 
    [October 2015] = MAX(CASE Mo WHEN 'October 2016' THEN ID END) 
    FROM DateExtract 
    GROUP BY ID 
) 
SELECT * 
FROM DateMatrix 
WHERE NOT([December 2015] IS NULL AND [November 2015] IS NULL AND [October 2015] IS NULL);