2016-04-24 2 views
-1

Я использую SQL Server 2012 и иметь таблицу, которая имеет следующие столбцы:T-SQL Pivot строки в колонке

ID, дата, CustomFieldName, CustomFieldValue

Столбец CustomFieldName имеет 100 значений (я знаю как глупо это звучит), но для простоты позволяет сказать, что они являются СпециальноеПоле1, CustomField2, СпециальноеПоле3

Я хотел бы создать стержень, где из положить выглядит

ID, дата, СпециальноеПоле1, CustomField2, СпециальноеПоле3 где e Макс. дата CustomFieldVaue агрегируется.

я потерпел неудачу ужасно в этом, но есть некоторый прогресс (хотя мой максимум разве права и получить много неправильных данных)

Любая помощь будет оценен по достоинству!

SELECT [date],[id], [CustomField1], [CustomField2], [CustomField3] 
from 
(
    SELECT [date], [id], [CustomFieldValue], [CustomFieldName], 
    row_number() over(partition by [CustomFieldName] order by [CustomFieldValue]) rn 
    from CustomTable 
) as st 
pivot 
(
    max([CustomFieldValue]) 
    FOR [CustomFieldName] in ([CustomField1], CustomField2, [CustomField3]) 
) as pivottable 
order by [id] 
+0

опустить 'id', и он будет работать так, как вы этого хотите. – mrtig

ответ

1

Надеюсь, что я получил это право, вы хотите, чтобы повернуть строки (COlumnName1,2, ... и т.д.), как колонны, так что я сделал небольшой скрипт, который будет готов к запуску.

Я рекомендую CTE, когда дело доходит до поворота, делает его легче, если вы хотите увидеть всю структуру запроса просто сделать select @xSqlString

set nocount on; 

create table 
    #testTable 
     (
      ID     int identity(1,1), 
      [Date]    datetime default getdate(), 
      CustomFieldName  nvarchar(50), 
      CustomFieldValue date 
     ); 

declare 
    @i int = 0, 
    @xSqlStringPivot nvarchar(max) = '', 
    @xSqlString  nvarchar(max) = ''; 

while(@i<=100) 
begin 

set 
    @xSqlStringPivot += concat('CustomFieldName',cast(@i as nvarchar(50)),char(13), case when @i<100 then ', ' else '' end); 

insert into #testTable 
    (
     CustomFieldName, 
     CustomFieldValue 
    ) 
values 
    (
     concat('CustomFieldName', cast(@i as nvarchar(50))), 
     dateAdd(day,[email protected],getdate()) 
    ); 

set 
    @i += 1; 

end; 


select * from 
    #testTable 


set 
    @xSqlString = 
     (
      'with ctePiv as 
      (
      select 
       t.CustomFieldName, 
       t.CustomFieldValue 
      from 
       #testTable t 
      ) 
      select 
       * 
      from 
       ctePiv 
      pivot 
      (
       max(customFieldValue) for customFieldName in 
        (
        '+ @xSqlStringPivot +'   
        ) 
      )p' 
     ); 

exec sp_executeSQL @xSqlString 


drop table #testTable; 

Редактировать 1

  1. Я ссылаюсь на пользовательскую таблицу на блоке while, в основном я повторяю 100 раз, чтобы заполнить таблицу 100 строками. Это просто для моделирования вашего дела.

    в то время как (@i < = 100) начинают

    установить @xSqlStringPivot + = CONCAT ('CustomFieldName', бросок (@i как NVARCHAR (50)), символ (13), случай, когда @i < 100 then ',' else '' end);

    вставки в #testTable ( CustomFieldName, CustomFieldValue ) значения ( Concat ('CustomFieldName', литые (@i в NVARCHAR (50))), DATEADD (день, - @ I, GETDATE()) );

    комплект @i + = 1;

    конец;

  2. @xSqlStringPivot - это всего лишь небольшой трюк, чтобы составить список элементов (CustomFieldName0, CustomFieldName1 и т. Д.) И объединить его в динамическую строку SQL, заметить, что я делаю это в блоке while, я просто конкатенация «CustomField» с текущим номером итерации и с переносом (пробел).

+0

Пара вопросов по этому сценарию, и я извиняюсь перед своим невежеством! 1. Я вижу, что вы используете временную таблицу, но где вы ссылаетесь на CustomTable для загрузки исходных данных? 2.CustomFieldValue может быть любым (строки, даты, ints и т. Д.), Моя цель состояла бы в том, чтобы ссылаться на них как на строки, поскольку они будут использоваться только для просмотра данных. 3. Для каждого ID мне нужно получить Max Request_date – Omid

+0

Конечно, спросите прочь, я также извиняюсь за то, что не объяснил весь сценарий, я буду переписывать свой ответ соответственно – ExtremeSwat

+0

Пожалуйста, проверьте основной поток, я сделал небольшой редактирование, связанное с вашим 1-м вопросом. Что значит «просматривать данные»? По максимальной дате запроса вы имеете в виду, что вы можете иметь несколько строк с тем же именем CustomValueName, но с разными значениями? – ExtremeSwat

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