2015-11-23 1 views
0

SQL ServerTSQL очереди строки таблицы на столбцы с именем столбца и значением, поступающих из ряда

У меня есть таблица с несколькими столбцами: ID, col1, col2, col3 ... у меня есть вторая таблица со столбцами : Идентификатор, тип, заголовок

Между первой и второй таблицами существует одно-много отношений на основе идентификатора.

Я хочу, чтобы создать представление или хранимую процедуру и т.д., которая соединяет их так, что я получаю

ID, col1, col2, COL3, типа как имя COL4 и название в качестве значения COL4

г. Второго таблица может добавить несколько столбцов к результатам, основанным на том, сколько записей существует на многих сторонах отношений.

Любые идеи относительно того, какую стратегию взять?

+0

Ваш Google Search Укус "SQL Server поворота запрос". –

+0

Спасибо Dan. Я знаю Pivot и использовал его раньше, но мне не удавалось выяснить, как сворачивать таблицу 2 в необходимый формат, а затем добавлять результаты в виде набора столбцов в первую таблицу. – Gork

+0

Слишком поздно, но эта ссылка для блога может вам помочь - [SQL Server - как получить имя столбца вместе со своим значением в виде строки и динамически отображать собственный заголовок столбца с помощью pivot] (https://krishnrajrana.wordpress.com/2017/11/14/sql-server-how-to-get-column-name-on-with-its-value-as-row-and-display-custom-column-header-dynamic-using-pivot /) –

ответ

0

Возможно, вы захотите попробовать Динамический сводный запрос. Это позволит вам создавать столбцы на основе значений type во второй таблице.

Существует несколько способов получить имена столбцов в формате, который вам понадобится для сводного запроса .. это один из способов.

DECLARE @columns VARCHAR(MAX) 
SELECT @columns = COALESCE(@columns + ',','') + QUOTENAME(type) 
FROM (SELECT DISTINCT [type] FROM secondTable) st 
ORDER BY st.[type] 

Это даст строку в формате [Type1],[Type2],[Type3] .. это позволяет нам использовать эту строку в Select и также Pivot часть динамического запроса.

Поскольку вы выполняете соединение, вам нужно создать подзапрос, который будет развернут, так как будет несколько столбцов ID, которые не разрешены в сводных точках.

Итак, постройте свой запрос, используя что-то вроде этого.

DECLARE @sql NVARCHAR(MAX) 
SET @sql = 
    'SELECT * FROM (
     SELECT ft.ID, 
      ft.Col1, 
      ft.Col2, 
      ft.Col3, 
      st.type, 
      st.value 
     FROM 
      firstTable ft 
      JOIN secondTable st ON ft.ID = st.ID 
    ) t 
    PIVOT 
    (
     MAX(Value) 
     FOR type in (' + @columns + ') 
    ) p 
' 
EXECUTE sp_executesql @sql 

Вы бы, конечно, использовать LEFT JOIN в вашем подзапрос, если вы хотите, чтобы все значения в firstTable, даже если они не в secondTable.

Затем вы можете выполнить этот запрос, используя EXEC(@sql) или Execute sq_executesql @sql.

SQL Fiddle

+0

Thank Вы. Это фактически создает точные результаты, которые я хочу. Я должен сказать, что это намного опережает мои знания SQL. Я буду изучать его и пытаться учиться. – Gork

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