SQL - поиск транзакции, содержащей 2 или более элемента, используя запрос

0

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

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)

  • 0
    Это не выглядит нормализованным. Для заданного идентификатора транзакции значения Value и Total_Item всегда одинаковы?
  • 0
    это всего лишь часть большой картины, весь процесс должен быть похож на этот Априори . значение отсчитывается от 1 / общей транзакции в 1 идентификаторе транзакции. Итого товара хорошо, сколько ID товара в 1 транзакции.
Теги:
ms-access

2 ответа

1
Лучший ответ

Они будут работать в 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
    спасибо :) это работает отлично: D теперь мне просто нужно выяснить, как сделать его рекурсивным в VB THX снова
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню