2010-05-04 1 views
0

Прежде всего жаль, что я не мог придумать более описательное название.SQL - счетные наборы значений поля-B для каждого значения поля-0

То, что я хочу сделать, это выполняется с помощью только SQL:

У меня есть списки строк, list1, list2 и List3.

У меня есть набор данных, содержащий два интересных столбца A и B. Столбец A содержит TransactionID, а столбец B содержит ItemID.

Естественно, может быть несколько строк, которые имеют одинаковые идентификаторы транзакций.

мне нужно поймать эти сделки, которые имеют по крайней мере один ItemID в каждом списке (песни1 И list2 И List3).

Мне также нужно подсчитать, сколько раз это происходит для каждой транзакции. [EDIT] То есть, подсчитайте, сколько полных наборов ItemID для каждого TransactionID есть, «Полный набор» - это любой элемент списка1 с любым элементом списка2 с любым элементом списка3

Я надеюсь, что имеет достаточно здравого смысла, возможно, я смогу объяснить это лучше с ясной головой.

заранее спасибо

+0

У вас также есть какой-то первичный ключ или уникальное ограничение на любой столбец или столбцы в вашей таблице? Или могут быть полностью идентичные дублированные строки? –

+1

Какая база данных? SQL Server? MySQL? –

+1

Существуют ли таблицы list1, list2 и list3 с одной строкой в ​​строке? Если нет, что вы подразумеваете под «списками строк»? Кроме того, я не понимаю: «Мне также нужно подсчитать, сколько раз это происходит для каждой транзакции».Укажите, сколько раз, что происходит для каждой транзакции? –

ответ

0

В MySQL, если вы h пр следующие списки:

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); 
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 
0

Если песни1, песни2, и 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), это более сложная проблема. Я хотел бы узнать больше, прежде чем пытаться найти запрос.

Смежные вопросы