У меня есть эта таблица:
TABLE Transaction
Trans_ID Name Value Total_Item
100 I1 0.33333333 3
100 I2 0.33333333 3
100 I5 0.33333333 3
200 I2 0.5 2
200 I5 0.5 2
300 I2 0.5 2
300 I3 0.5 2
400 I1 0.33333333 3
400 I2 0.33333333 3
400 I4 0.33333333 3
500 I1 0.5 2
500 I3 0.5 2
600 I2 0.5 2
600 I3 0.5 2
700 I1 0.5 2
700 I3 0.5 2
800 I1 0.25 4
800 I2 0.25 4
800 I3 0.25 4
800 I5 0.25 4
900 I1 0.33333333 3
900 I2 0.33333333 3
900 I3 0.33333333 3
1000 I1 0.2 5
1000 I2 0.2 5
1000 I4 0.2 5
Мне нужно найти, какая транзакция содержит какой-то элемент. EX: комбинация 2 предметов
I1 и I2 и сохранение только связанного значения элемента;
Trans_ID Name Value Total_Item
100 I1 0.33333333 3
100 I2 0.33333333 3
400 I1 0.33333333 3
400 I2 0.33333333 3
800 I1 0.25 4
800 I2 0.25 4
900 I1 0.33333333 3
900 I2 0.33333333 3
1000 I1 0.2 5
1000 I2 0.2 5
Обратите внимание: я показываю только транзакцию, содержащую оба элемента.
или, возможно, 3 комбинации предметов I1, I2 и I3
800 I1 0.25 4
800 I2 0.25 4
800 I3 0.25 4
900 I1 0.33333333 3
900 I2 0.33333333 3
900 I3 0.33333333 3
Как сделать код в sql? я работаю с msaccess)
Они будут работать в Access:
SELECT * FROM Transaction t
WHERE t.Trans_ID IN
(SELECT t1.Trans_ID
FROM (SELECT *
FROM Transaction
WHERE [Name]="I1") AS t1
INNER JOIN
(SELECT *
FROM Transaction
WHERE [Name]="I2") AS t2
ON t1.Trans_ID = t2.Trans_ID)
AND t.Name IN ("I1","I2")
SELECT * FROM Transaction t
WHERE t.Trans_ID IN
(SELECT t1.Trans_ID
FROM ((SELECT *
FROM Transaction
WHERE [Name]="I1") AS t1
INNER JOIN
(SELECT *
FROM Transaction
WHERE [Name]="I2") AS t2
ON t1.Trans_ID = t2.Trans_ID)
INNER JOIN
(SELECT *
FROM Transaction
WHERE [Name]="I3") AS t3
ON t1.Trans_ID = t3.Trans_ID )
AND t.Name IN ("I1","I2","I3")
Для комбинации двух элементов выполните поиск совпадающих строк и убедитесь, что все условия выполнены в предложении having
:
select Trans_ID
from `Transaction`
where Name in ('I1','I2')
group by
Trans_ID
having COUNT(distinct Name) = 2
Для комбинации трех элементов проверьте три вместо двух совпадений:
select Trans_ID
from `Transaction`
where Name in ('I1','I2','I3')
group by
Trans_ID
having COUNT(distinct Name) = 3
Если вас интересуют все столбцы, поместите этот запрос в подзапрос:
select *
from `Transaction`
where Trans_ID in
(
select Trans_ID
from `Transaction`
where Name in ('I1','I2','I3')
group by
Trans_ID
having COUNT(distinct Name) = 3
)