SQL - 计算每个Field-A值的Field-B值集

时间:2010-05-04 18:18:55

标签: sql logic set

首先对不起,我想不出更具描述性的标题。

我想要做的是以下仅使用SQL:

我有一些字符串列表,list1,list2和list3。

我有一个包含两个有趣列A和B的数据集。列A包含TransactionID,列B包含ItemID。

当然,可以有多个行共享相同的TransactionID。

我需要捕获那些在每个列表中至少有一个ItemID的事务(list1 AND list2 AND list3)。

我还需要计算每次交易发生的次数。 [编辑]也就是说,计算每个TransactionID有多少完整的ItemID“,”完整集合“是list1的任何元素,list2的任何元素都包含list3的任何元素

我希望这有足够的意义,或许我能够以清醒的头脑更好地解释它。

提前致谢

3 个答案:

答案 0 :(得分:0)

取决于您的方言,并假设您的列表是其他表...

SELECT
    TransactionID, Count1, Count2, Count3
FROM
    MyDataSet M
    JOIN
    (SELECT COUNT(*), ItemID AS Count1 FROM List1 GROUP BY ItemID) T1 ON T1.ItemID = M.ItemID
    JOIN
    (SELECT COUNT(*), ItemID AS Count2 FROM List2 GROUP BY ItemID) T2 ON T2.ItemID = M.ItemID
    JOIN
    (SELECT COUNT(*), ItemID AS Count3 FROM List3 GROUP BY ItemID) T3 ON T3.ItemID = M.ItemID

答案 1 :(得分:0)

在MySQL中,如果您有以下列表:

list1 = ('1', '3')
list2 = ('2', '3')
list3 = ('3', '5')

然后你可以这样做:

SELECT
    TransactionID,
    SUM(ItemID IN ('1', '3')) AS list1_count,
    SUM(ItemID IN ('2', '3')) AS list2_count,
    SUM(ItemID IN ('3', '5')) AS list3_count
FROM table1
GROUP BY TransactionID
HAVING list1_count > 0 AND list2_count > 0 AND list3_count > 0

结果:

TransactionId  list1_count  list2_count  list3_count
1              3            2            1
3              2            2            1

测试数据:

CREATE TABLE table1 (ID INT NOT NULL, TransactionID INT NOT NULL, ItemID INT NOT NULL);
INSERT INTO table1 (ID, TransactionID, ItemID) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 1, 4),
(5, 1, 1),
(6, 2, 1),
(7, 2, 2),
(8, 2, 1),
(9, 2, 4),
(10, 3, 3),
(11, 3, 2),
(12, 3, 1);

答案 2 :(得分:0)

如果list1,list2和list3实际上是已知的枚举,您可以使用:

SELECT TransactionID, COUNT(*)
FROM MyTable
WHERE ItemID IN (list1) AND ItemID IN (list2) AND ItemID IN (list3)
GROUP BY TransactionID

如果您有很多列表,则可能需要在程序中生成SQL。但是,即使对于很多列表,它仍应表现得相当好。首先放置您希望具有最少匹配的列表,以便您尽快停止评估谓词。

如果你的列表在另一个表中,也许是一堆形式的元组(list_id,item_id),这是一个棘手的问题。在尝试提出查询之前,我想了解更多。