2015-10-01 5 views
0

Я пытаюсь развернуть столбец join_date (datetime) и разделить его на год + месяц и группу на mtype и он должен быть динамическим, поскольку дата изменится.SQL Server dynamic Pivot with datetime

ТАБЛИЦА

+-------+------------------+ 
| Mtype | join_date  | 
+-------+------------------+ 
| A  | 28/05/2014 00:00 | 
| B  | 04/11/2014 00:00 | 
| C  | 23/03/2007 00:00 | 
| D  | 04/09/2013 00:00 | 
| E  | 26/11/2014 00:00 | 
| F  | 24/07/2011 00:00 | 
| G  | 28/05/2014 00:00 | 
| A  | 20/06/2013 00:00 | 
| B  | 04/11/2014 00:00 | 
| C  | 20/06/2013 00:00 | 
+-------+------------------+ 

Желаемый результат

+-------+---------+---------+---------+---------+---------+---------+--------+--------+--------+ 
| Mtype | 2015-03 | 2015-02 | 2015-01 | 2014-12 | 2014-11 | 2014-10 | 2014-9 | 2014-8 | 2014-7 | 
+-------+---------+---------+---------+---------+---------+---------+--------+--------+--------+ 
| A  |  45 |  7 |  54 |  875 |  45 |  7 |  54 | 875 |  25 | 
| B  |  7 |  78 |  78 |  7 |  7 |  78 |  78 |  7 |  78 | 
| C  |  546 |  6 |  87 |  5 |  45 |  6 |  87 |  5 |  25 | 
| D  |  54 |  78 |  54 |  8 |  54 |  78 |  54 |  7 |  7 | 
| E  |  78 |  78 |  7 |  45 |  78 |  78 |  7 |  45 |  6 | 
| F  |  46 |  54 |  6 |  8 |  46 |  54 |  6 |  8 |  75 | 
| G  |  54 |  87 |  87 |  7 |  54 |  87 |  87 |  45 |  8 | 
+-------+---------+---------+---------+---------+---------+---------+--------+--------+--------+ 

Это мой взгляд на запрос, но я не могу понять, как получить Pivot работает

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + LEFT(DATENAME(MONTH,join_date),3)+'/'+CAST(YEAR(join_date) AS 
       VARCHAR(4)) + ']', 
       '[' + LEFT(DATENAME(MONTH,join_date),3)+'/'+CAST(YEAR(join_date) AS VARCHAR(4)) + ']') 
       FROM (SELECT DISTINCT join_date FROM MData T0) PV 
       ORDER BY join_date 

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT Mtype, LEFT(DATENAME(MONTH,join_date),3)+''/''+CAST(YEAR(join_date) AS join_date VARCHAR(4)) FROM MData T0 
      ) x 
      PIVOT 
      (
       count(join_date) 
       join_date IN (' + @cols + ') 
      ) p;' 

EXEC SP_EXECUTESQL @query 
+0

В PIVOT вы пропустите FOR как этот PIVOT ( счета (join_date) ДЛЯ join_date В –

+0

я получаю Неправильный синтаксис около 'VARCHAR', не могу видеть, где – user5350968

+0

Ошибка в строке запроса в @query переменная –

ответ

0

Здесь код sql для генерации вывода.

DECLARE @cols NVARCHAR (MAX) 
DECLARE @query NVARCHAR (MAX) 
SELECT @cols = COALESCE (@cols + ',[' + CONVERT(VARCHAR(7), join_date, 120) + ']', 
      '[' + CONVERT(VARCHAR(7), join_date, 120) + ']') 
      FROM (SELECT DISTINCT CONVERT(VARCHAR(7), join_date, 120) as join_date FROM Mdata) PV 
      ORDER BY join_date 

SELECT @query = 'SELECT * 
FROM 
(
    SELECT Mtype, CONVERT(VARCHAR(7), join_date, 120) as join_date FROM Mdata 
) AS t 
PIVOT 
(
    COUNT(join_date) 
    FOR join_date IN(' + @cols + ')' + 
') AS p ;' 

EXEC SP_EXECUTESQL @query 

Вот скриншот результата.

enter image description here

+0

в результате -Columns MTYPE \t \t 1984-01 1990-11 MCPD конечные результаты 0, так это только показывает мне две колонки даты (из старейших членов) – user5350968

+0

не получили вас. вы бы пожалуйста, объясни. Я уже тестировал его локально, и он дает выход желания. –

+0

Результат - первый столбец mtype (отлично работает), а затем у меня есть только 2 столбца, взятых из join_date (самые старые записи 1984-01 и 1990-11), остальное отсутствует. – user5350968