Как вывести повторяющиеся строки на основе заданного условия

#sql

#sql

Вопрос:

У меня есть таблица следующего вида

 create table t (
  invoice_no int,
  serial_no text,
  price decimal(10,2));

insert into t values
(1001, 'XYZ123', 20),
(1002, 'XYZ123', 20),
(1003, 'XYZ456', 24),
(1004, 'XYZ456', 24),
(1005, 'ABC109', 15),
(1006, 'BGF108', 15),
(1006, 'ABC107', 10),
(1006, 'ABC104', 10);
  

Счет-фактура может иметь несколько серийных номеров. (т. Е. Счет с несколькими продуктами на нем)

Мне нужно найти счета, серийные номера которых указаны более чем в одном счете. Затем мне нужно узнать эти счета и серийные номера. В противном случае мне нужно, чтобы запрос возвращал нулевые записи.

Ответ №1:

Вы можете использовать EXISTS :

 SELECT t.*
FROM table t
WHERE EXISTS (SELECT 1 FROM table t1 WHERE t1.serial_no = t.serial_no AND t1.Invoice_no <> t.Invoice_no);
  

Ответ №2:

Вы можете попробовать это

 select serial_no
from tablename
group by serial_no
having count(*)>1
  

Ответ №3:

если одинаковые серийные номера отображаются в нескольких счетах, мне нужно узнать эти счета и серийные номера.

Вы можете сделать это с помощью group by и array_agg() :

 select serial_no, array_agg(invoice_no)
from t
group by serial_no
having count(*) >= 2;
  

Если вам нужны фактические строки, то вы можете использовать exists (как предложил Йогеш).

Ответ №4:

Чтобы найти повторяющиеся серийные номера, используйте count и group by

 select serial_no
from t
group by serial_no
having count(*) >= 2
  

и получить счета с соответствующими серийными номерами

 select invoice_no, serial_no
from t
where serial_no in (select serial_no
                    from t
                    group by serial_no
                    having count(*) >= 2);
  

Смотрите Sqlfiddle

Ответ №5:

используйте STRING_AGG() аналитическую функцию

 select serial_no, STRING_AGG(invoice_no)
from t
group by serial_no
having count(*) >1;