Как выбрать строки, которые имеют значения столбцов, которые являются дубликатами в одном столбце, но разные значения в другом? - PullRequest
2 голосов
/ 03 марта 2020

В основном я хочу выбрать ромы, которые появляются более одного раза, но с учителями (namn), имеющими разные телефонные значения (тел) (это могут быть комнаты altair, kompis и mulitplan). Как выбрать строки так, чтобы они стали;

rum   namn    tel
Altair    Jonas   1074
Altair    Lisen   1076
Kompis    Johan   1067
Kompis    Dina    1076
Multiplan Rikard  1064
Multiplan Henrik  1067

На дисплее ниже?;

tel         namn        rum
----------  ----------  ----------
1083        Agneta      ADRS
1076        Lisen       Altair
1074        Jonas       Altair
1075        Maria       Bus
1032        Amir        Cache
1063        Kjell       Gopher
1077        Kalle       Hub
1077        Magnus      Hub
1077        Urban       Hub
1054        Faramarz    Java
1076        Dina        Kompis
1067        Johan       Kompis
1071        Juha        Modem
1067        Henrik      Multiplan
1064        Rikard      Multiplan
1173        Aida        Pacman
1042        Fredrik     Printer
1076        William     RAM
1080        Janne       Sinclair
1065        Lennart     Telnet
1061        Marie       Thinktank
1073        Alan        VisiCalc

Ответы [ 3 ]

2 голосов
/ 03 марта 2020

Вы можете использовать exists для фильтрации таблицы по записям, где существует другая запись с таким же rum и другим tel:

select t.*
from mytable t
where exists (
    select 1
    from mytable t1
    where t1.rum = t.rum and t1.tel <> t.tel
)
order by rum, tel

Демонстрация в БД Скрипка :

 tel | namn   | rum      
---: | :----- | :--------
1074 | Jonas  | Altair   
1076 | Lisen  | Altair   
1067 | Johan  | Kompis   
1076 | Dina   | Kompis   
1064 | Rikard | Multiplan
1067 | Henrik | Multiplan
1 голос
/ 03 марта 2020
select x.*
into #df
from
 (
select 1083 tel, 'Agneta' namn, 'ADRS' rum UNION ALL 
select 1076 tel, 'Lisen' namn, 'Altair' rum UNION ALL 
select 1074 tel, 'Jonas' namn, 'Altair' rum UNION ALL 
select 1075 tel, 'Maria' namn, 'Bus' rum UNION ALL 
select 1032 tel, 'Amir' namn, 'Cache' rum UNION ALL 
select 1063 tel, 'Kjell' namn, 'Gopher' rum UNION ALL 
select 1077 tel, 'Kalle' namn, 'Hub' rum UNION ALL 
select 1077 tel, 'Magnus' namn, 'Hub' rum UNION ALL 
select 1077 tel, 'Urban' namn, 'Hub' rum UNION ALL 
select 1054 tel, 'Faramarz' namn, 'Java' rum UNION ALL 
select 1076 tel, 'Dina' namn, 'Kompis' rum UNION ALL 
select 1067 tel, 'Johan' namn, 'Kompis' rum UNION ALL 
select 1071 tel, 'Juha' namn, 'Modem' rum UNION ALL 
select 1067 tel, 'Henrik' namn, 'Multiplan' rum UNION ALL 
select 1064 tel, 'Rikard' namn, 'Multiplan' rum UNION ALL 
select 1173 tel, 'Aida' namn, 'Pacman' rum UNION ALL 
select 1042 tel, 'Fredrik' namn, 'Printer' rum UNION ALL 
select 1076 tel, 'William' namn, 'RAM' rum UNION ALL 
select 1080 tel, 'Janne' namn, 'Sinclair' rum UNION ALL 
select 1065 tel, 'Lennart' namn, 'Telnet' rum UNION ALL 
select 1061 tel, 'Marie' namn, 'Thinktank' rum UNION ALL 
select 1073 tel, 'Alan' namn, 'VisiCalc' rum
) x;

select rum, namn, tel 
from #df
where rum in  
    (
    select rum 
    from #df
    group by rum
    having count(distinct tel)>1 -- (number of different tel numbers for specific rum)>1
    )

enter image description here

1 голос
/ 03 марта 2020

Для каждой группы rum сравните количество записей, имеющих одинаковый rum, с отличным количеством телефонных номеров:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT rum
    FROM yourTable
    GROUP BY rum
    HAVING COUNT(*) > 1 AND COUNT(DISTINCT tel) > 1
) t2
    ON t1.rum = t2.rum;

Критерии принятия таковы, что в группе rum есть два или более записей, хотя в то же время для этой группы есть как минимум два разных телефонных номера.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...