2015-01-06 2 views
-1

У меня есть следующие столбцы, 5-значный идентификатор, дата и значение. Идентификатор повторяется только при наличии новой даты.

Дата запроса SQL в новые столбцы с уникальным идентификатором

ID  Date  Value 
11111 2014-12-31 45 
22222 2014-12-31 435 
33333 2014-12-31 11 
11111 2014-12-30 5 
22222 2014-12-30 2245 
33333 2014-12-30 86 
11111 2014-12-29 43 
22222 2014-12-29 4678 
33333 2014-12-29 2494 

Я пытаюсь создать запрос SQL, который будет отображать следующие (даты имена столбцов):

ID  2014-12-31  2014-12-30  2014-12-29 
11111  45    5    43 
22222  435    2245   4678 
33333  11    86    2494 

Что такое лучший способ сделать это с помощью MS SQL.

Благодаря

+1

Сколько у вас разных дат? – agim

+3

Поиск «примеров PIVOT» или «динамических примеров PIVOT» должен быстро доставить вас туда. Также нажмите кнопку '{}' после выделения данных образца или кода, чтобы отформатировать его как код в своем вопросе. –

+0

У вас здесь две проблемы. Вы пытаетесь сделать динамическую перекрестную вкладку или точку поворота. Кроме того, вы затем пытаетесь динамически использовать значения из одного столбца в качестве имен столбцов для динамически повернутых данных. Такого рода вещи намного проще в лицевой части. Это трудно и часто очень медленно в sql. –

ответ

0

Как было отмечено в комментариях, вам необходимо PIVOT данные. Вот один из способов использования динамической кросс-таблицы.

Прочитайте эту статью Джеффа Moden для справки: http://www.sqlservercentral.com/articles/Crosstab/65048

CREATE TABLE temp(
    ID  INT, 
    [Date] DATE, 
    Value INT 
) 
INSERT INTO temp VALUES 
(11111, '2014-12-31', 45), 
(22222, '2014-12-31', 435), 
(33333, '2014-12-31', 11), 
(11111, '2014-12-30', 5), 
(22222, '2014-12-30', 2245), 
(33333, '2014-12-30', 86), 
(11111, '2014-12-29', 43), 
(22222, '2014-12-29', 4678), 
(33333, '2014-12-29', 2494); 

DECLARE @sql1 VARCHAR(2000) = '' 
DECLARE @sql2 VARCHAR(2000) = '' 
DECLARE @sql3 VARCHAR(2000) = '' 

SELECT @sql1 = 
'SELECT 
    ID 
' 

SELECT @sql2 = @sql2 + 
' ,MIN(CASE WHEN [Date] = CAST(''' + CONVERT(VARCHAR(10), [Date], 120) + ''' AS Date) THEN Value END) AS [' 
    + CONVERT(VARCHAR(10), [Date], 120) + ']'+ CHAR(10) 
FROM(
    SELECT DISTINCT [Date] FROM temp 
)t 
ORDER BY [Date] DESC 

SELECT @sql3 = 
    'FROM temp 
    GROUP BY ID 
    ORDER BY ID' 

PRINT (@sql1 + @sql2 + @sql3) 
EXEC (@sql1 + @sql2 + @sql3) 

DROP TABLE temp 

EDIT: Если вы хотите использовать фиксированное имя, вы хотите, чтобы назначить номер для каждого Date. Это можно сделать, используя ROW_NUMBER():

SELECT @sql2 = @sql2 + 
' ,MIN(CASE WHEN [Date] = CAST(''' + CONVERT(VARCHAR(10), [Date], 120) + ''' AS Date) THEN Value END) AS [Date' + CONVERT(VARCHAR, rn) + ']'+ CHAR(10) 
FROM(
    SELECT 
     [Date], 
     rn = ROW_NUMBER() OVER(ORDER BY [Date]) 
    FROM (
     SELECT DISTINCT [Date]FROM temp 
    )x 
)t 
ORDER BY [Date] DESC 
+0

Спасибо, это похоже на работу. Если я когда-либо захочу изменить этот скрипт, чтобы отобразить имена фиксированных столбцов, такие как Date1, Date2, Date3 .... что нужно изменить? – Yura

Смежные вопросы