#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;