SQL Server Сводит Несколько Строковых Полей

#sql #sql-server #pivot

Вопрос:

Я работаю с некоторыми данными этого формата в базе данных SQL Server:

 [ID_1] | [ID_2] | [ID_3] | ... | [ID_n] | [Change Type (Str)] | [oldVal (Str)] | [newVal (Str)]
--------------------------------------------------------------------------------------------------
  w    |   x    |   y    |     |   z    |          A          |       "1"      |       "2"
  w    |   x    |   y    |     |   z    |          B          |       "5"      |       "20"
  a    |   b    |   c    |     |   d    |          A          |       "2"      |       "3"
 

Для каждого элемента есть несколько идентифицирующих полей, ведущих к типу изменения, из которых меня интересуют два изменения (A, B). Для каждого типа изменений существует старое значение и новое значение. Если в элементе есть изменения как типа A, так и типа B, будут созданы две строки.

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

 [ID_1] | [ID_2] | [ID_3] | ... | [ID_n] | [oldValA (Str)] | [newValA (Str)] | [oldValB (Str)] | [newValB (Str)]
----------------------------------------------------------------------------------------------------------------
  w    |   x    |   y    |     |   z    |         "1"     |       "2"       |       "5"       |       "20"   
  a    |   b    |   c    |     |   d    |         "2"     |       "3"       |       NULL      |       NULL
 

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

Комментарии:

1. Если в элементе есть изменения как типа A, так и типа B, будут созданы две строки. Желаемый результат, по-видимому, противоречит этому. И я предполагаю, что вы сделаете некоторые важные предположения. Что происходит, когда для данного «элемента»имеется 3 (или 7, или 10) строк? Например, у элемента «x» было изменение B, изменение A, а затем изменение B? Похоже, здесь может быть важен порядок?

2. «Создаются две строки» — это то, что происходит, если вы выбираете всю таблицу в ее текущем состоянии. Я хотел бы разделить эти две строки на отдельные столбцы, поскольку дополнительные строки для одинаковых идентификаторов (от 1 до n) присутствуют только для разных типов изменений. Я добился желаемого результата, дважды присоединив источник к себе слева (по одному разу для каждого типа изменений). Однако это не элегантно.

3. Я не очень хорошо описал поля (от 1 до n). Они представляют собой комбинацию полей, используемых для идентификации одного элемента. Например, [insert_date], [identifier1], [identifier2], [start_date] — и тому подобное.