Найти повторяющиеся значения с другим годом в SQL

Как я могу искать повторяющиеся записи в таблице, но с разными годами.

My sample data:

Cus_No  Item_No Ord_Dt  Orders 
1       A       2016    1
1       A       2017    2
1       B       2016    1
2       B       2015    1
2       B       2018    1
Output needed
Cus_No  Item_No Ord_Dt  Orders 
1       A       2016    1 
1       A       2017    2
2       B       2015    1
2       B       2018    1 
I am trying to collect all records with the same Cus_No, the same Item_No that has any value in Orders and exist in any year in Ord_dt. The reason is, I need to find those items with the same customer number that has orders from all years. I am using MS Query and this is the SQL statement I tried but still displays all records.

SELECT `'table'`.Cus_No, `'table'`.Item_No, `'table'`.Ord_Dt, `'table'`.Orders
FROM `'table'`
WHERE (`'table'`.Orders>=1) AND (`'table'`.Ord_Dt In ('2016','2017'))

person user3113137    schedule 28.02.2018    source источник
comment
Пожалуйста, включите образец данных непосредственно в свой вопрос, не в виде ссылки на изображение. А также покажите нам ожидаемый результат.   -  person Tim Biegeleisen    schedule 28.02.2018
comment
Как я могу искать повторяющиеся записи... что вы хотите делать с ними при поиске?   -  person lurker    schedule 28.02.2018
comment
Предоставленный вами SQL несовместим с SQL Server (SQL Server не использует обратные кавычки). А MS Query — это действительно древняя программа-редактор SQL.   -  person Dai    schedule 28.02.2018
comment
@TimBiegeleisen Отредактировал мой пост. Спасибо   -  person user3113137    schedule 28.02.2018
comment
Почему рекорд 2016 B исчезает?   -  person Tim Biegeleisen    schedule 28.02.2018
comment
@TimBiegeleisen В этой записи нет других заказов ни за один год. Учитывая, что товар является образцом продукта. Конкретный продукт или предмет следует отдавать только покупателю. Товар или продукт, который был заказан или передан более одного раза, считается дублирующим заказом.   -  person user3113137    schedule 28.02.2018


Ответы (3)


Предполагая, что вы хотите идентифицировать записи, соответствующие товарам клиентов, появившимся более чем за один год, мы можем попробовать следующее:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT Cus_No, Item_No
    FROM yourTable
    GROUP BY Cus_No, Item_No
    HAVING COUNT(DISTINCT Ord_Dt) > 1
) t2
    ON t1.Cus_No  = t2.Cus_No AND
       t1.Item_No = t2.Item_No
person Tim Biegeleisen    schedule 28.02.2018
comment
У меня есть еще одна проблема. Я попытался заменить yourTable на фактическое имя таблицы Table$ в операторе MS Query, но возвращает ошибку, SQL Query не может быть представлен графически. Я также пытался посмотреть, помогает ли эта ссылка link - person user3113137; 28.02.2018
comment
Я не знаю вашу базу данных. На самом деле большинство приведенных здесь ответов должны помочь вам, по крайней мере, в ANSI SQL. - person Tim Biegeleisen; 28.02.2018
comment
И последний вопрос. В чем разница между внутренним соединением, которое вы дали из этого утверждения? 'код' ВЫБЕРИТЕ Table$.Номер_заказчика, Table$.Номер_предмета ИЗ Table$ Table$ СГРУППИРОВАТЬ ПО Table$.Номер_заказчика, Table$.Номер_предмета ИМЕЮТ (Количество(*)›1) - person user3113137; 28.02.2018
comment
Это может быть нормально, если вы уверены, что данный год появляется только один раз для товара и покупателя. - person Tim Biegeleisen; 28.02.2018
comment
Большое спасибо, Тим. Я получил идею сейчас. Будет работать над запуском MS Query. - person user3113137; 28.02.2018

Ниже запрос возвращает дубликаты -

select * from test where (cus_no, item_no) in (
select Cus_No, item_no from test group by Cus_No, item_no having count(*) > 1)
person Ajay    schedule 28.02.2018

Удар в темноте:

with agg as (
    select cust_no, item_no from T
    group by cust_no, item_no
    where ord_dt in (...)
    having count(*) = <num years in list>
)    
select *
from T t inner join agg a
    on  a.cust_no = t.cust_no
        and a.item_no = t.item_no;
person shawnt00    schedule 28.02.2018