SQL - поиск транзакции, содержащей 2 или более элемента, используя запрос - PullRequest
0 голосов
/ 04 декабря 2010

У меня есть эта таблица:

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 

Мне нужно найти транзакцию, содержащую какой-либо элемент.Пример: комбинация 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)

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Это будет работать в 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")
0 голосов
/ 04 декабря 2010

Для комбинации из двух элементов найдите подходящие строки и убедитесь, что все условия выполнены в предложении 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
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...