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 |
Ну или так
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