@trapepaul

Как найти в одной таблице больше трех совпадений по нескольким полям?

Есть таблица продаж товара:
Date | cheque_id | item | position | qty
2022-09-12 | 1 | 1 | 1 |  0.237
2022-09-12 | 1 | 2 | 2 |  0.238
2022-09-12 | 1 | 3 | 3 |  0.239
2022-09-12 | 2 | 1 | 1 |  0.210
2022-09-12 | 2 | 2 | 2 |  0.210
2022-09-12 | 3 | 5 | 1 |  0.240
2022-09-12 | 4 | 9 | 1 |  0.322
2022-09-12 | 4 | 8 | 2 |  0.322

Нужно вывести все записи с информацией по каждому товару, где округленный вес до 2 знака после запятой совпадает больше чем 3 раза в одном cheque_id
Т.е. в данном примере результат должен быть:
Date | cheque_id | item | position | qty
2022-09-12 | 1 | 1 | 1 |  0.237
2022-09-12 | 1 | 2 | 2 |  0.238
2022-09-12 | 1 | 3 | 3 |  0.239

Такое решение:
SELECT distinct t1.date, t1.cheque_id, t1.item, t1.position, t1.qty 
			FROM items_sales t1
				JOIN items_sales t2 
							on t1.date = t2.date
							and t1.cheque_id = t2.cheque_id
        JOIN items_sales t3 
							on t3.date = t2.date
							and t3.cheque_id = t2.cheque_id
			where ROUND(t1.qty,2) = ROUND(t2.qty,2) 
				and ROUND(t2.qty,2) = ROUND(t3.qty,2)
				and t1.position != t2.position
				and t1.position != t3.position
				and t2.position != t3.position

Есть более простой вариант? А если нужно найти 4, 5 или еще больше совпадений по одному cheque_id?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Делаете запрос с группировкой по cheque_id и ROUND(qty,2) и соответствующим HAVING , а потом соединяете его с основной таблицей.

Добавил в первый заказ позицию, которая не отвечает условию по количеству.
DECLARE @items_sales TABLE ( [Date] DATE, cheque_id INT, item INT, position INT, qty REAL )
INSERT @items_sales VALUES
('2022-09-12', 1, 1, 1, 0.237),
('2022-09-12', 1, 2, 2, 0.238),
('2022-09-12', 1, 3, 3, 0.322),
('2022-09-12', 1, 4, 4, 0.239),
('2022-09-12', 2, 1, 1, 0.210),
('2022-09-12', 2, 2, 2, 0.210),
('2022-09-12', 3, 5, 1, 0.240),
('2022-09-12', 4, 9, 1, 0.322),
('2022-09-12', 4, 8, 2, 0.322)

SELECT * 
  FROM @items_sales AS Iteams
    JOIN ( SELECT cheque_id, ROUND( qty, 2) AS RoundQty
             FROM @items_sales
             GROUP BY cheque_id, ROUND( qty, 2)
             HAVING COUNT(*) >= 3 ) AS IteamCount
      ON IteamCount.cheque_id = Iteams.cheque_id
         AND IteamCount.RoundQty = ROUND( qty, 2)
  ORDER BY [Date], Iteams.cheque_id, item
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы