Как объединить РЕГИСТР, ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ и ГРУППУ ПО

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я имею дело с проблемой; Мне нужно объединить две таблицы, сгруппировать по их идентификаторам и использовать инструкцию CASE для сравнения значений из этих 2 таблиц. Я пытался использовать временную таблицу, а затем выбирать из нее.

Цель состоит в том, чтобы проверить, соответствуют ли значения в CORE значениям в MART.

В идеале я хочу иметь один запрос, где я буду видеть столбец CORE_X_MART и могу использовать для него оператор where.

Группировка по важна, потому что в противном случае у меня есть дубликаты идентификаторов во временной таблице.

Мой код:

 drop table if exists #tNDWH_4034

select a.ID, b.ID, a.col2 as MART_Value, b.col2 as CORE_Value,
case when a.col2 = b.col2 then 'Match' else 'Mismatch' end as CORE_X_MART
into #tNDWH_4034
from       tab1 as a
inner join tab2 as b on a.ID = b.ID
where a.CurrentFlag = 1
group by a.ID, b.ID;
 
select * from #tNDWH_4034
where CORE_X_MART = 'Mismatch';
  

Я использую SQL Server.

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

1. Пожалуйста, предоставьте образцы данных и желаемые результаты в виде табличного текста.

2. GROUP BY предназначен для использования с установленными функциями (MAX(), SUM(), COUNT() и т.д.)

3.Это case выражение, а не оператор.

4. Вы говорите, что это GROUP BY сделано намеренно, но вы не GROUP BY агрегируете все столбцы, которые вы не агрегируете, и вы не агрегируете какие -либо GROUP BY столбцы, поэтому, конечно, не требуется, и в нынешнем виде это приведет к ошибке.

5. Чтобы сделать дублирующиеся значения уникальными, вы можете попробовать использовать DISTINCT

Ответ №1:

Вам не нужна временная таблица. Вы можете использовать производную таблицу для достижения цели, чтобы иметь их в одном запросе.

 
SELECT * FROM
(select a.ID, b.ID, a.col2 as MART_Value, b.col2 as CORE_Value,

case when a.col2 = b.col2 then 'Match' else 'Mismatch' end as CORE_X_MART

 from tab1 as a
 inner join tab2 as b 
 on a.ID = b.ID

where a.CurrentFlag = 1

group by a.ID, b.ID) as t
WHERE t.CORE_X_MART = 'Mismatch'
  

Ответ №2:

может быть:

    select a.ID, b.ID, a.col2 as MART_Value, b.col2 as CORE_Value,
    
   case when a.col2 = b.col2 then 'Match' else 'Mismatch' end as CORE_X_MART
    
   into #tNDWH_4034
    
   from tab1 as a
   inner join tab2 as b on (a.ID = b.ID)
    
    where a.CurrentFlag = 1
    
    group by a.ID, b.ID, a.col2, b.col2
,case when a.col2 = b.col2 then 'Match' else 'Mismatch' end --this line is probably not required
  

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

1. Поскольку основная задача состоит в том, чтобы проверить, есть ли совпадение между значениями в таблицах A и B, я предлагаю ЛЕВОЕ СОЕДИНЕНИЕ, чтобы вы могли также видеть идентификатор в A, а не в B (они будут отображаться как несоответствие, так как value = NULL значение false в РЕГИСТРЕ)

Ответ №3:

Вам также не нужны временная таблица, group by или регистр. Вы ищете только несоответствия, поэтому просто используйте оператор not equal to <> для фильтрации ваших результатов.

 select distinct a.ID, a.col2 as MART_Value, b.col2 as CORE_Value
from       tab1 as a
inner join tab2 as b on a.ID = b.ID
where a.CurrentFlag = 1
and a.col2 <> b.col2