#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] — и тому подобное.