Как отфильтровать данные по условию в той же строке?

Доброго дня! Не смог отойти от предметной области, потому привожу реальный пример.
Подскажите, как реализовать условие:

Есть БОЛЬШОЙ запрос, который выводит табличные данные из многих таблиц, код обрезанный представлен ниже.
Все хорошо, но понадобилось добавить поля и сделать условие: сравнивать поля, если
Наименование предка ВГ (автопривязка) = Наименование предка ВГ на МПВ (автопривязка) - выводим
Наименование предка ВГ (автопривязка) != Наименование предка ВГ на МПВ (автопривязка) и их больше двух, то выводим то что СОВПАДАЕТ
Наименование предка ВГ (автопривязка) != Наименование предка ВГ на МПВ (автопривязка) - НЕ ВЫВОДИМ

Сложно объяснить, удобнее посомтреть картинку. Красным выделено то, что надо убрать.

Еще - используется MS SQL 2008 R2, поднять версию на выше не получится.

Я думаю дело в JOIN, но не знаю как такое вообще возможно реализовать.

Как должно быть - привожу на скриншоте:
602b7114e37b0029831352.jpeg

В коде объединение --ДОБАВЛЯЕМ ПРЕДКА ВГ НА МПВ

Упрощенный код запроса


use GMSN_XMAO
go

WITH myCTE (MPV_COD, [MPV_name], MPV_parent, MPV_NAME_PREDOK, Code_use_type, Code_mon_type, Code_district) AS
(
/* выборка потомков и предков из таблицы ВГ*/
SELECT t1.Code_MPV MPV_COD ,t1.[MPV_name] MPV_COD, t2.Code_MPV MPV_parent, t2.[MPV_name] MPV_NAME_PREDOK, t1.Code_use_type Code_use_type, t1.Code_mon_type Code_mon_type, t1.Code_district Code_district
FROM MPV_catalogue t1
LEFT JOIN MPV_catalogue t2 ON t1.Code_parent = t2.Code_MPV
),
CTE_WG ( Code_WG, WG_index, water_gorizont, Code_parent, WG_parent, parent_name ) AS
(
SELECT t1.Code_WG Code_WG, t1.WG_index WG_index, t1.[Water_gorizont] water_gorizont, t2.Code_WG parent_id, t2.WG_index WG_parent, t2.[Water_gorizont] parent_name
FROM Voc_water_gorizont t1
LEFT JOIN Voc_water_gorizont t2 ON t1.Code_parent = t2.Code_WG
--ТОЛЬКО локального уровня
-- where t1.Local = 1
),


CTE_MPV_WG ( Code_WG, WG_index, water_gorizont, Code_parent, WG_parent, parent_name ) AS
(
SELECT t1.Code_WG Code_WG, t1.WG_index WG_index, t1.[Water_gorizont] water_gorizont, t2.Code_WG parent_id, t2.WG_index WG_parent, t2.[Water_gorizont] parent_name
FROM Voc_water_gorizont t1
LEFT JOIN Voc_water_gorizont t2 ON t1.Code_parent = t2.Code_WG
)


SELECT

myCTE.MPV_COD as 'Служебный',
case when myCTE.Code_mon_type = '1'
then myCTE.MPV_COD
else myCTE.MPV_parent end as 'КОД МПВ',


CTE_MPV_WG.WG_parent as 'Индекс предка ВГ на МПВ (автопривязка)',
CTE_MPV_WG.parent_name as 'Наименование предка ВГ на МПВ (автопривязка)',
COALESCE(CTE_WG.WG_parent,'ПУСТО') as 'Индекс предка ВГ (автопривязка)', COALESCE(CTE_WG.parent_name,'ПУСТО') as 'Наименование предка ВГ (автопривязка)',
VZ_catalogue.Code_VZ


FROM [VZ_catalogue]


left join VZ_gidrogeol_feature
ON VZ_catalogue.Code_VZ = VZ_gidrogeol_feature.Code_VZ

left join
(
SELECT *
FROM Voc_water_gorizont
) WG_fed
ON VZ_gidrogeol_feature.Code_WG_fed = WG_fed.Code_WG

left outer join VZ_correspondence
ON VZ_catalogue.Code_VZ = VZ_correspondence.Code_VZ


left outer join myCTE
ON VZ_correspondence.Code_MPV = myCTE.MPV_COD

left JOIN
(

SELECT Region, Code_Region
FROM Voc_region
) MPV_REGION

ON myCTE.Code_district = MPV_REGION.Code_region



--ищем нужные ВГ в новой таблице
left outer join VZ_equipment t3
ON VZ_catalogue.Code_VZ = t3.Code_VZ


left outer join Voc_water_gorizont
ON t3.Code_WG = Voc_water_gorizont.Code_WG

left outer join CTE_WG
ON Voc_water_gorizont.Code_WG = CTE_WG.Code_WG

--ДОБАВЛЯЕМ ПРЕДКА ВГ НА МПВ
left join
MPV_Spares_WG
ON myCTE.MPV_COD = MPV_Spares_WG.Code_MPV
AND MPV_Spares_WG.Datasz IS NULL

left JOIN CTE_MPV_WG
ON MPV_Spares_WG.Code_WG = CTE_MPV_WG.Code_WG
AND CTE_WG.Code_WG = MPV_Spares_WG.Code_WG

--ДОБАВЛЯЕМ ПРЕДКА ВГ НА МПВ

where VZ_catalogue.Code_use_type IS NOT NULL


--- отладка дублей по ВГ
AND VZ_catalogue.Code_VZ = 711341003
--OR VZ_catalogue.Code_VZ = 711341003
--OR VZ_catalogue.Code_VZ = 711341004


--Группировка для вывода дополнительных столбцов по типам вод ХПВ, ПТВ и так далее

GROUP BY
myCTE.MPV_COD,
myCTE.Code_mon_type,
myCTE.MPV_parent,
myCTE.MPV_NAME_PREDOK,
myCTE.MPV_name,
VZ_catalogue.Code_VZ,

CTE_WG.WG_parent, CTE_WG.parent_name,
WG_fed.WG_index,
WG_fed.Water_gorizont

---Выводим предка ВГ НА МПВ

,CTE_MPV_WG.WG_parent
,CTE_MPV_WG.parent_name


  • Вопрос задан
  • 43 просмотра
Пригласить эксперта
Ответы на вопрос 1
@VitalyChaikin
'Наименование предка ВГ as NP
'Наименование предка ВГ на МПВ (автопривязка) as NP_MPV
SELECT список_полей
GROUP BY список_полей
HAVING (COUNT(NP_MPV) = 1 AND NP = NP_MPV)
       OR (COUNT(NP_MPV) > 1 AND NP IS NOT NULL)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы