Вот результаты реализации ответа, который я принял выше. Надеюсь, это будет полезно всем, кто следует за этим, кто сталкивается с подобной проблемой.
Концептуально оператор UNPIVOT моделирует именно то, что я пытаюсь выполнить; еще неизвестно, не было ли у него какого-либо ограничения реализации, которое помешало бы мне использовать его. Поскольку у меня было много столбцов для «распаковки», было два основных подхода к использованию оператора UNPIVOT. (1) Я мог бы запустить отдельный UNPIVOT для каждого рассматриваемого столбца, или (2) , я мог бы запустить один UNPIVOT и затем условно вычислить остальные столбцы на основе этого результата , Я выбрал второй подход, потому что мне было немного легче его понять, но я все еще заинтересован в том, чтобы проверить их в будущем.
Результирующий запрос по-прежнему не элегантно повторяется (он должен повторять один и тот же блок из десяти условий), но он невероятно упрощен по сравнению с чудовищностью, с которой я работал изначально. Самое главное, когда я запускаю это в соответствии со старым запросом, это только 9% от общей стоимости запроса, по сравнению с 91% от старого запроса. Так что, похоже, он также намного эффективнее.
Вот переработанный запрос (все еще длинный, но, вероятно, только около 20% от длины старого)
SELECT
Case(FN) WHEN 'FirstName' THEN 'Primary' ELSE 'Guest' END as RegType,
(Case(FN) WHEN 'FirstName' THEN 0
WHEN 'FF_27637_1' THEN 1
WHEN 'FF_27742_1' THEN 2
WHEN 'FF_27638_1' THEN 3
WHEN 'FF_27639_1' THEN 4
WHEN 'FF_27640_1' THEN 5
WHEN 'FF_27641_1' THEN 6
WHEN 'FF_27642_1' THEN 7
WHEN 'FF_27643_1' THEN 8
WHEN 'FF_27644_1' THEN 9
WHEN 'FF_27645_1' THEN 10 END) as GuestNo,
Confirmation,
FirstNames as FirstName,
(Case(FN) WHEN 'FirstName' THEN LastName
WHEN 'FF_27637_1' THEN FF_27637_152806
WHEN 'FF_27742_1' THEN FF_27742_153577
WHEN 'FF_27638_1' THEN FF_27638_152814
WHEN 'FF_27639_1' THEN FF_27639_152817
WHEN 'FF_27640_1' THEN FF_27640_152852
WHEN 'FF_27641_1' THEN FF_27641_152860
WHEN 'FF_27642_1' THEN FF_27642_152868
WHEN 'FF_27643_1' THEN FF_27643_152877
WHEN 'FF_27644_1' THEN FF_27644_152885
WHEN 'FF_27645_1' THEN FF_27645_152893 END) as LastName,
(Case(FN) WHEN 'FirstName' THEN Email
WHEN 'FF_27637_1' THEN FF_27637_152807
WHEN 'FF_27742_1' THEN FF_27742_153578
WHEN 'FF_27638_1' THEN FF_27638_152815
WHEN 'FF_27639_1' THEN FF_27639_152818
WHEN 'FF_27640_1' THEN FF_27640_152853
WHEN 'FF_27641_1' THEN FF_27641_152861
WHEN 'FF_27642_1' THEN FF_27642_152869
WHEN 'FF_27643_1' THEN FF_27643_152878
WHEN 'FF_27644_1' THEN FF_27644_152886
WHEN 'FF_27645_1' THEN FF_27645_152894 END) as Email,
(Case(FN) WHEN 'FirstName' THEN HotelCheckOut
WHEN 'FF_27637_1' THEN FF_27637_152821
WHEN 'FF_27742_1' THEN FF_27645_152896
WHEN 'FF_27638_1' THEN FF_27742_153580
WHEN 'FF_27639_1' THEN FF_27638_152847
WHEN 'FF_27640_1' THEN FF_27639_152842
WHEN 'FF_27641_1' THEN FF_27640_152855
WHEN 'FF_27642_1' THEN FF_27641_152863
WHEN 'FF_27643_1' THEN FF_27642_152871
WHEN 'FF_27644_1' THEN FF_27643_152880
WHEN 'FF_27645_1' THEN FF_27644_152888 END) as HotelChoice,
(Case(FN) WHEN 'FirstName' THEN HotelCheckIn
WHEN 'FF_27637_1' THEN FF_27637_152813
WHEN 'FF_27742_1' THEN FF_27742_153579
WHEN 'FF_27638_1' THEN FF_27638_152816
WHEN 'FF_27639_1' THEN FF_27639_152819
WHEN 'FF_27640_1' THEN FF_27640_152854
WHEN 'FF_27641_1' THEN FF_27641_152862
WHEN 'FF_27642_1' THEN FF_27642_152870
WHEN 'FF_27643_1' THEN FF_27643_152879
WHEN 'FF_27644_1' THEN FF_27644_152887
WHEN 'FF_27645_1' THEN FF_27645_152895 END) as HotelCheckIn,
(Case(FN) WHEN 'FirstName' THEN HotelCheckOut
WHEN 'FF_27637_1' THEN FF_27637_152821
WHEN 'FF_27742_1' THEN FF_27742_153580
WHEN 'FF_27638_1' THEN FF_27638_152847
WHEN 'FF_27639_1' THEN FF_27639_152842
WHEN 'FF_27640_1' THEN FF_27640_152855
WHEN 'FF_27641_1' THEN FF_27641_152863
WHEN 'FF_27642_1' THEN FF_27642_152871
WHEN 'FF_27643_1' THEN FF_27643_152880
WHEN 'FF_27644_1' THEN FF_27644_152888
WHEN 'FF_27645_1' THEN FF_27645_152896 END) as HotelCheckOut,
(Case(FN) WHEN 'FirstName' THEN HotelRoomPreference
WHEN 'FF_27637_1' THEN FF_27637_152823
WHEN 'FF_27742_1' THEN FF_27742_153582
WHEN 'FF_27638_1' THEN FF_27638_152849
WHEN 'FF_27639_1' THEN FF_27639_152844
WHEN 'FF_27640_1' THEN FF_27640_152857
WHEN 'FF_27641_1' THEN FF_27641_152865
WHEN 'FF_27642_1' THEN FF_27642_152874
WHEN 'FF_27643_1' THEN FF_27643_152882
WHEN 'FF_27644_1' THEN FF_27644_152890
WHEN 'FF_27645_1' THEN FF_27645_152898 END) as RoomType,
(Case(FN) WHEN 'FirstName' THEN HotelSmoking
WHEN 'FF_27637_1' THEN FF_27637_152824
WHEN 'FF_27742_1' THEN FF_27742_153583
WHEN 'FF_27638_1' THEN FF_27638_152850
WHEN 'FF_27639_1' THEN FF_27639_152845
WHEN 'FF_27640_1' THEN FF_27640_152858
WHEN 'FF_27641_1' THEN FF_27641_152866
WHEN 'FF_27642_1' THEN FF_27642_152875
WHEN 'FF_27643_1' THEN FF_27643_152883
WHEN 'FF_27644_1' THEN FF_27644_152891
WHEN 'FF_27645_1' THEN FF_27645_152899 END) as Smoking,
(Case(FN) WHEN 'FirstName' THEN NULL
WHEN 'FF_27637_1' THEN FF_27637_154245
WHEN 'FF_27742_1' THEN FF_27742_154247
WHEN 'FF_27638_1' THEN FF_27638_154249
WHEN 'FF_27639_1' THEN FF_27639_154251
WHEN 'FF_27640_1' THEN FF_27640_154253
WHEN 'FF_27641_1' THEN FF_27641_154255
WHEN 'FF_27642_1' THEN FF_27642_154257
WHEN 'FF_27643_1' THEN FF_27643_154259
WHEN 'FF_27644_1' THEN FF_27644_154261
WHEN 'FF_27645_1' THEN FF_27645_154263 END) as SharingWith,
FROM Event
UNPIVOT (FirstNames for FN in (FirstName, FF_27637_1, FF_27742_1, FF_27638_1, FF_27639_1, FF_27640_1, FF_27641_1, FF_27642_1, FF_27643_1, FF_27644_1, FF_27645_1)) as FirstNames
WHERE Audience = 'Primary' and Submitted = 1 and Cancelled = 0 and Type = 'Production' ORDER BY Confirmation
В качестве примечания, если я пытаюсь запустить это как представление, я получаю сообщение об ошибке, что UNPIVOT не поддерживается. Если я помещу ту же самую вещь в представление и сделаю ее производной таблицей - SELECT * FROM (...query...)
) - я получу то же самое предупреждение в Studio Manager, но он возвращает результаты просто отлично. Weird.
Еще раз спасибо за все ваши ответы.