Сравнение столбцов в группе в SQL - PullRequest
1 голос
/ 02 августа 2011

Я очень плохо знаком с SQL, поэтому прошу прощения, если этот вопрос трудно понять.

Допустим, у меня есть таблица типа:

Name    Birthday
Bob     7/18
Bob     7/18
Mark    5/10
Mark    7/5  
Sue     2/1
Joe     1/14
Joe     1/14
Joe     1/2
Jeff    9/16
Jeff    3/20
Jeff    6/13
[...]

Я хотел бы выступить с отборным заявлением, в котором указаны имена людей, у которых более одного дня рождения.

Итак, для моего примера таблицы выводятся Марк, Джо и Джефф.

Спасибо за вашу помощь.

Ответы [ 4 ]

1 голос
/ 02 августа 2011

Формулировка, как я понимаю формулировку вашей проблемы:

Все имена, где:
- С именем связано более одного цвета
- Из них как минимум два цвета имеютс ними связаны разные дни рождения

В чем я не уверен, возможно ли иметь два разных дня рождения для одного и того же цвета, связанного с одним и тем же именем?


Если no,цвет становится неактуальным, вам просто нужно имя с более чем одним днем ​​рождения, связанным с ним.

SELECT
  Name
FROM
  yourTable
GROUP BY
  name
HAVING
  COUNT(DISTINCT birthday) > 1


Если `да`, вам нужно найти другую запись сто же имя, но другой цвет и другой день рождения.ВЫБЕРИТЕ Имя ИЗ ВАШЕЙ ТАБЛИЦЫ, ГДЕ ЕСТЬ (ВЫБЕРИТЕ * ИЗ ВАШЕЙ ТАБЛИЦЫ как [lookup], ГДЕ Имя = yourTable.Name И День Рождения yourTable.Birthday AND Color yourTable.Colour) GROUP BY Name
1 голос
/ 02 августа 2011
SELECT name FROM table_xyz 
GROUP BY Name, Birthday
HAVING count(*) = 1
1 голос
/ 02 августа 2011

попробуйте это:

select
    NAME
    FROM (select
              NAME
              FROM YourTable
              GROUP BY Name,Birthday
              HAVING Count(Name)=1
         ) dt
    GROUP BY Name
    HAVING COUNT(Name)>1

рабочий пример кода для SQL Server:

DECLARE @YourTable table (name varchar(10),Birthday varchar(10), FavoriteColor varchar(10))
INSERT @YourTable VALUES ('Bob'  ,   '7/18'   ,    'Blue')
INSERT @YourTable VALUES ('Bob'  ,   '7/18'   ,    'Green')
INSERT @YourTable VALUES ('Mark' ,   '5/10'   ,    'Blue')
INSERT @YourTable VALUES ('Mark' ,   '7/5'    ,    'Green')

select
    NAME
    FROM (select
              NAME
              FROM @YourTable
              GROUP BY Name,Birthday
              HAVING Count(Name)=1
         ) dt
    GROUP BY Name
    HAVING COUNT(Name)>1

ВЫВОД:

NAME
----------
Mark
0 голосов
/ 02 августа 2011

Вы можете сделать это несколькими различными способами. Вы можете либо JOIN сама таблица, либо вы можете использовать предложение EXISTS.

SELECT DISTINCT
    T1.name
FROM
    Some_Table AS T1
WHERE
    EXISTS (SELECT *
            FROM Some_Table T2
            WHERE T2.name = T1.name AND
                  T2.birthday <> T1.birthday)

или

SELECT DISTINCT
    T1.name
FROM
    Some_Table AS T1
INNER JOIN Some_Table AS T2 ON
    T2.name = T1.name AND
    T2.birthday <> T1.birthday

Вы также можете решить эту конкретную проблему, используя предложение HAVING:

SELECT
    T1.name
FROM
    Some_Table AS T1
GROUP BY
    T1.name
HAVING
    MAX(birthday) <> MIN(birthday)
...