从 SQL 服务器中的字符串中提取月份名称和年份并以它们为中心

Extract Month Name and Year from string in SQL server and pivot on them

我想从 SQL 服务器中的字符串中提取月份名称和年份并在 them.I 上进行透视我有以下格式的数据

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

我需要两个结果集。 一个是所有有效的日期和年份 示例:

原因

December 2015
November 2015
October 2016

第二个输出格式

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

这是解决此问题的一种方法:

-- 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);