Вложенный оператор GROUP SQL - PullRequest
0 голосов
/ 19 июля 2011

У меня есть таблица MYTABLE. Это содержит клиентов и местоположения.

Какое заявление Sql я могу использовать, чтобы узнать, какие клиенты имеют более 1 местоположения и показывать только на тех, у кого более 1 местоположения? Местоположение может быть использовано для нескольких разных клиентов.

Это не сработало: показывалось только количество случаев

SELECT CU _NO, LOC_NO, COUNT(LOC_NO) AS NUMBEROCC
FROM MYTABLE
GROUP BY LOC_NO
HAVING (COUNT(LOC_NO)>1)

В таблице имеется несколько строк одного и того же клиента (извините, это было важно)

Ответы [ 3 ]

2 голосов
/ 19 июля 2011

Вам необходимо включить все неагрегированные поля вашего предложения SELECT в предложение GROUP BY, поэтому вам нужно удалить поле и группу LOC на CU_NO.

SELECT CU_NO, COUNT(LOC_NO) AS NUMBEROCC
FROM MYTABLE
GROUP BY CU_NO
HAVING (COUNT(LOC_NO)>1)
1 голос
/ 19 июля 2011
SELECT m.CU_NO
     , m.LOC_NO
     , grp.NUMBEROCC
FROM MYTABLE AS m
  JOIN
    ( SELECT CU_NO
           , COUNT(DISTINCT LOC_NO) AS NUMBEROCC
      FROM MYTABLE
      GROUP BY CU_NO
      HAVING COUNT(DISTINCT LOC_NO) > 1
    ) AS grp
    ON grp.CU_NO = m.CU_NO
ORDER BY m.CU_NO
1 голос
/ 19 июля 2011

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

SELECT t.CU_NO, t.LOC_NO, t.NUMBEROCC
FROM (
    SELECT CU_NO, LOC_NO, COUNT(LOC_NO) OVER (PARTITION BY CU_NO) AS NUMBEROCC
    FROM MYTABLE
) AS t
WHERE t.NUMBEROCC > 1

Если вас интересуют не все местоположения, а только идентификаторы клиентов, вы можете использовать простую группу по предложению:

SELECT CU_NO
FROM MYTABLE
GROUP BY CU_NO
HAVING COUNT(DISTINCT LOC_NO) > 1

Но в обоих случаях вы хотите группировать по CU_NO, а не по LOC_NO!


Реализация оконных функций на SQL-сервере (пока!) Не включена COUNT(DISTINCT x) OVER(PARTITION BY x). Итак, это вызывает ошибку:

SELECT t.CU_NO, t.LOC_NO, t.NUMBEROCC
FROM (
    SELECT CU_NO, LOC_NO
         , COUNT(DISTINCT LOC_NO) OVER (PARTITION BY CU_NO) AS NUMBEROCC
    FROM MYTABLE
) AS t
WHERE t.NUMBEROCC > 1

Обходной путь должен использовать DENSE_RANK() OVER() и MAX() OVER() с одним дополнительным уровнем запроса:

SELECT x.CU_NO, x.LOC_NO, x.NUMBEROCC
FROM (
    SELECT t.CU_NO, t.LOC_NO
         , MAX(DR) OVER(PARTITION BY CU_NO) AS NUMBEROCC
    FROM (
        SELECT CU_NO, LOC_NO
             , DENSE_RANK() OVER (PARTITION BY CU_NO ORDER BY LOC_NO) AS DR
        FROM MYTABLE
    ) AS t
) AS x
WHERE x.NUMBEROCC > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...