Показывать местоположения, в которых остался только один элемент

#sql #oracle #group-by #aggregate #having

#sql #Oracle #группировать по #агрегировать #наличие

Вопрос:

Я хочу отобразить все местоположения, в которых остался только один элемент. Пробовал использовать функцию SUM, но она по-прежнему выдает мне несколько строк с одинаковым местоположением, 3 артикля nr, сумма которых равна 1

SELECT location, artnr, sum(qty)
FROM location_stock
GROUP BY location, artnr
HAVING sum(qty) = 1

Результат:

Location Art Nr Sum(Qty)
12345 5345 1
12345 5874 1
12345 4756 1

Мне нужны местоположения с одним номером статьи и одним количеством:

Location Art Nr Sum(Qty)
12345 5345 1

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

1. почему вам нужно только 5345 для номера столбца

2. это просто пример. В моем примере у нас есть местоположение 12345, в котором есть 3 статьи. Мне нужно только местоположение, в котором есть одна статья.

Ответ №1:

вы можете использовать row_number() функцию окна

    select * from ( SELECT location, artnr, sum(qty) as s,
    row_number() over(partition by location order by artnr asc) rn
    FROM location_stock
    GROUP BY location, artnr
    HAVING sum(qty) = 1
    ) a where a.rn=1
  

Ответ №2:

Предполагая, что количество никогда не бывает отрицательным или нулевым, тогда это должно сработать:

 SELECT location, max(artnr) as artnr, sum(qty)
FROM location_stock
GROUP BY location
HAVING SUM(qty) = 1;
  

Для более общего решения:

 SELECT location, max(artnr) as artnr, sum(qty)
FROM location_stock
GROUP BY location
HAVING MIN(artnr) = MAX(artnr) AND
       SUM(qty) = 1;
  

Если вас на самом деле не волнует количество, а только одно artnr , то удалите условие на SUM(qty) .