группировать строки с одинаковым эквивалентным значением

#sql #sql-server #sql-server-2008

#sql #sql-сервер #sql-server-2008

Вопрос:

У меня есть следующий образец данных в таблице (EQUCODES), столбец «CODE» имеет эквивалентное значение, которое представлено в столбце «EQCODE». Это значение в столбце «EQCODE» может быть другой записью с тем же значением в столбце «CODE», и эквивалентное значение будет иметь обратное значение, т.е.

 ID  || CODE || EQCODE  
--------------------------
1   ||  a   || b   
2   ||  b   || a   
3   ||  c   || d   
4   ||  d   || c   
  

другая таблица (CLIENTTYPE), к которой я хочу присоединиться, имеет следующую структуру,

 CLIENTID  || CODE   
--------------------------
1         ||  a  
2         ||  a    
3         ||  b   
4         ||  a   
6         ||  b   
7         ||  b   
  

Как я могу сгруппировать эти записи типа CLIENTTYPE таким образом, чтобы запрос возвращал одну запись, потому что они являются эквивалентами после их объединения с таблицей EQUCODES ?

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

1. Если вы хотите объединить две входные таблицы, пожалуйста, предоставьте выходные данные.

Ответ №1:

Чтобы найти канонический код для каждого клиента, используйте это:

 select ClientID, min(code) as Code
from (
    select ClientID, EQUCODES.EQCode as Code
    from CLIENTTYPE inner join EQUCODES on CLIENTTYPE.Code = EQUCODES.Code
  Union
    select ClientID, EQUCODES.Code
    from CLIENTTYPE inner join EQUCODES on CLIENTTYPE.Code = EQUCODES.EQCode
) U
Group By ClientID
  

Если затем вы захотите выполнить агрегирование по code , вы можете обернуть этот запрос в это:

 select Code, count(ClientID) from
( -- the query above
) G
Group by Code