Выберите запись из одного столбца, который не находится в другом столбце - PullRequest
0 голосов
/ 27 марта 2019

Допустим, у меня есть 2 вкладки Excel (A) и (B):

TAB (A)

+----------+
|City      |
+----------+
| Seattle  | 
| New York | 
| Boston   | 
| Miami    |  
+----------+

TAB (B)

+------------+---------+
|City        | Name    | 
+------------+---------+
| Seattle    | Klay    | 
| Seattle    | Walis   | 
| New York   | Walis   | 
| Boston     | Klay    | 
| Miami      | John    | 
| New York   | Klay    |
+------------+---------+

Я пытаюсь сгруппировать их, чтобы получить новую вкладку (результат), где у меня есть список городов, в которые люди НИКОГДА не шли группой по имени:

TAB (РЕЗУЛЬТАТ)

+------------+---------+
|Name        | City    | 
+------------+---------+
| Klay       | Miami   |
|----------------------|
| Walis      | Boston  | 
|            | Miami   |
|----------------------|
| John       |Seattle  |
|            |New York |
|            |Boston   |
+------------+---------+

Единственное решение, с которым я пришел, - это использование сводной таблицы, но я ищу противоположный результат! Я также использую Index & Match, но он не работает.

Ответы [ 5 ]

1 голос
/ 28 марта 2019

Поскольку вы упомянули, что пытаетесь сделать это в Excel, вот решение для Excel. Давайте представим, что у вас есть все настройки данных на одной вкладке, например:

enter image description here

В ячейке G2 и копируется снова и вниз по этой формуле:

=IF(COLUMN(A2)>ROWS($A$2:$A$5)-COUNTIF($D$2:$D$7,$F2),"",INDEX($A$2:$A$5,MATCH(1,INDEX((COUNTIFS($D$2:$D$7,$F2,$C$2:$C$7,$A$2:$A$5)=0)*(COUNTIF($F2:F2,$A$2:$A$5)=0),),0)))

При желании вы можете вырезать и вставлять каждый раздел на отдельную вкладку.

0 голосов
/ 28 марта 2019

Одно из возможных решений

Select b.name, a.city city_to_visit
From a join b on 1 = 1
Minus — some db use except
Select b.name, b.city city_visited
From b
0 голосов
/ 28 марта 2019

на сервере sql это будет примерно так

- tsql

with tableC  AS 
(
SELECT 
    a.City
    ,b.name
FROM tableA a
cross join (select distinct name from tableB) b
 )

SELECT 
    c.*
FROM tableC c
LEFT JOIN tableB b
    ON c.City = b.City
    AND c.name = b.name
WHERE b.city IS NULL
0 голосов
/ 28 марта 2019

Если это действительно проблема MySQL, вам нужно получить каждую комбинацию имени и города, а затем исключить комбинации, которые посещают.

SELECT bNames.Name, tableA.City
FROM (SELECT DISTINCT Name FROM tableB) AS bNames 
CROSS JOIN tableA
WHERE (bNames.Name, tableA.City) NOT IN (SELECT Name, City FROM tableB)
ORDER BY bNames.Name, tableA.City
;

В результате не будет пропущено повторное имя пользователя при последующихзаписей, но это почти всегда лучше обрабатывать после обработки результатов.

0 голосов
/ 28 марта 2019

Это ваше желание?

    SELECT NAME,
          CASE WHEN (SELECT 
          CITY 
          FROM TAB1)  NOT IN 
          CITY
         Then City
         END CASE  From Tab1 LEFT JOIN 
         TAB2 ON TAB1.CITY=Tab2.CITY
         GROUP BY NAME;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...