sql.Вывести количество дубликатов в справочнике товаров

есть таблица с ценами на товары

CREATE TABLE t_goods_price (
    id integer NOT NULL,
    id_goods integer,
    c_price numeric(10,2)
);

в ней могут быть данные такого вида

id_goods c_price
1 50
1 40
1 50
2 15
2 10
3 100
3 101
3 102
4 15

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

id_goods c_price count_dbl
1 50 1
1 40 1
2 15 1
2 10 1
3 100 2
3 101 2
3 102 2

Ответы (2 шт):

Автор решения: CrazyElf

Если я правильно понял, то схема решения будет примерно такая:

  • сначала select id_goods group by id_goods, c_price чтобы "схлопнуть" товары с одинаковой ценой в одну запись
  • затем из получившегося select id_goods, count(*)-1 as count_dbl group by id_goods - собственно счётчик дублей в вашей формулировке
  • выкинуть записи где получился 0 в count_dbl (судя по отсутствию товара 4 в результате, такие записи выкидываем)
  • затем join исходной таблицы с тем, что у нас тут получилось
→ Ссылка
Автор решения: Akina
SELECT DISTINCT 
       id_goods, c_price,
       ( SELECT COUNT(DISTINCT c_price)
         FROM t_goods_price t2
         WHERE t1.id_goods = t2.id_goods
           AND t1.c_price <> t2.c_price ) count_dbl
FROM t_goods_price t1
HAVING count_dbl > 0
id_goods c_price count_dbl
1 50.00 1
1 40.00 1
2 15.00 1
2 10.00 1
3 100.00 2
3 101.00 2
3 102.00 2

fiddle

Ну или так

SELECT t1.id_goods, t1.c_price, COUNT(DISTINCT t2.c_price) - 1 count_dbl
FROM t_goods_price t1
JOIN t_goods_price t2 USING (id_goods)
GROUP BY 1, 2
HAVING count_dbl > 0
→ Ссылка