#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)
.