2015-12-29 5 views
1

У меня возникли проблемы с помощью команды поворота - я получаю следующую ошибкуSQL - ошибка при использовании команды поворота

«Неверное имя столбца„2013-03-22“Invalid имя столбца«2013-03. -29 '. Неверное имя столбца «2013-04-05». Недопустимое имя столбца «Том». Недопустимое имя столбца «Конечная дата недели».

при выполнении этого кода

SELECT * 
FROM 
(
    SELECT [Area], 
    [Region], 
    [Channel], 
    [Controller], 
    [2013-03-22] AS _dt1, 
    [2013-03-29] AS _dt2, 
    [2013-04-05] AS _dt3 
    FROM [DataTable] 
) AS SourceTable 
PIVOT 
(
    SUM ([Volume]) 
    FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29], [2013-04-05]) 
) AS PivotTable 

Это, кажется, соответствует правильный формат .. любые идеи?

+0

Вы переименовали столбцы в '' _dt1', _dt2' и т.д. в вашем подзапрос так столбцы '[2013-03-22] [2013-03-29], [2013 -04-05] 'не существует. Вам нужно использовать имена псевдонимов или пропустить псевдоним. Кроме того, у вас нет столбца с именем 'Volume' или' Week Ending Date'. – Taryn

+0

@bluefeet: спасибо, но не идея избавиться от столбцов объема и недели через поворот? – dashnick

+0

Да, похоже, вы хотите его суммировать, но у вас нет столбца 'volume' в вашем подзапросе. Если столбец не существует в подзапросе, он не может его суммировать. В каком столбце вашего подзапроса содержится значение объема? Можете ли вы создать SQL Fiddle с некоторыми примерами данных? Или даже отредактируйте свой вопрос, чтобы включить образцы данных? – Taryn

ответ

2

Кажется, что таблица источника не включать значения для столбцов для поворота, но должен содержать столбцы, содержащие значения для поворота и значения, которые нужно поворачивать. Смотрите ниже:

SELECT [Area], 
[Region], 
[Channel], 
[Controller], 
[2013-03-22] as _dt1, 
[2013-03-29] as _dt2, 
[2013-04-05] as _dt3 
FROM 
(
SELECT [Area], 
[Region], 
[Channel], 
[Controller], 
[Volume], 
[Week Ending Date] 
FROM [DataTable] 
) AS SourceTable 
PIVOT(SUM ([Volume]) FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29], 
[2013-04-05])) 
AS PivotTable 
0

обычно я делаю мои шарнирные столбцы динамически, то я бег выполнить sp_executesql @query

  1. найти отчетливую ДАТУ «2013-03-22» ... затем превратить его в строку использовать STUFF и XML PATH

  2. заменить его в встроенном запросе SQL

так что вы никогда не жестко закодировать столбцам

здесь пример у меня есть

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 
    select @cols = STUFF((SELECT N',' + QUOTENAME(c.name) 
    FROM sys.tables AS t 
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
    WHERE t.name = 'tagCloudLibrary' 
    and c.name not in ('langID') 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 


    set @query = N'SELECT ' + @cols + N' from tagCloudLibrary' 
    execute sp_executesql @query; 

ЗДЕСЬ, если ваш PIVOT правильно сделать ПРАВИЛЬНЫЙ ИНЕКЕ для STUFF ...

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 
    select @cols = STUFF((SELECT top 10 N',' + QUOTENAME(LastActivityDate) 
    FROM DataTable 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

    select @cols 

    set query = N'SELECT * FROM 
     (SELECT [Area], [Region], [Channel], [Controller], ' + @cols 
    + N' FROM [DataTable]) AS SourceTable ' 
    + N' PIVOT (SUM ([Volume]) FOR [Week Ending Date] IN (' + @cols + ') AS PivotTable ' 

    execute sp_executesql @query; 
+0

Очевидно, кто понизил мое решение, никогда в жизни не делал программно PIVOTTING и HARD CODE HIS COLUMNS –

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