Все виды разворота требуют условной агрегации.Это единственный способ для вашей СУБД собрать несколько строк в одну.
Некоторые СУБД предоставляют специфичные для поставщика функции, которые реализуют сводную логику (SQL Server - одна из них, как и Oracle).Но они в основном просто синтаксический сахар поверх базовой идеи, которая всегда сводится к условной агрегации.
Я обычно выступаю против этих реализаций, специфичных для конкретного поставщика, поскольку прирост сложности запроса и большой выигрышпотеря переносимости (и удобочитаемости, если вы не являетесь экспертом в этом конкретном языке).
Вот стандартное решение для сводных данных, которое будет работать на большинстве, если не на всех СУБД:
SELECT
MAX(CASE WHEN LevelName = 'Level1' THEN ParentNodeName END) as [Level1],
MAX(CASE WHEN LevelName = 'Level2' THEN ParentNodeName END) as [Level2]
FROM vOrgStructurePath
WHERE orgstructureid = 1545
Вы можете легко обработать этот запрос сразу по нескольким orgstructureid
, изменив его следующим образом:
SELECT
orgstructureid,
MAX(CASE WHEN LevelName = 'Level1' THEN ParentNodeName END) as [Level1],
MAX(CASE WHEN LevelName = 'Level2' THEN ParentNodeName END) as [Level2]
FROM vOrgStructurePath
GROUP BY orgstructureid
Это создает одну запись на orgstructureid
вместе с Level1
и Level2
значения.