2015-02-10 2 views
0

Я пытаюсь показать список учетных записей, в которых в одном и том же календарном месяце было заказано 2 одинаковых продукта для одной учетной записи.SQL - получение данных на основе нескольких условий

имена полей:

A/c number, 
Order id, 
Cust name, 
Product, 
Purchase date 

Я использовал GROUP BY и HAVING, но я обеспокоен объемом возвращаемых записей.

+3

Пожалуйста редактировать свой вопрос, чтобы показать запрос, который вы используете, и объяснить, почему вы «обеспокоены с объем возвращаемых записей ". –

+0

Я угадываю, что поле идентификатора заказа - это то, что отбрасывает вас, удалите это поле. Также у вас есть поле count для наличия> 1? – JB13

+0

Какая СУБД вы используете? Postgres? Oracle? –

ответ

0

Я предлагаю сделать внутреннее соединение на одном столе дважды. Что-то вроде:

SELECT o1.* 
FROM orders o1 
INNER JOIN orders o2 
    ON o1.account_num = o2.account_num 
    AND o1.product_id = o2.product_id 
    AND MONTH(o1.purchase_date) = MONTH(o2.purchase_date) 
    AND YEAR(o1.purchase_date) = YEAR(o2.purchase_date) 

Я просто хочу, чтобы указать на то, что вы должны соответствовать ОБА месяцы и годы, чтобы избежать согласования что-то приобрели на 1/2014 с 1/2015

0
SELECT * 
FROM TABLE as table2 
INNER JOIN table as table1 
on table1.product = table2.product AND MONTH(table1.purchase_date) = MONTH(tabl2.purchase_date) AND YEAR(table1.purchase_date) = YEAR(table2.purchase_date) 

Это должно сделать трюк.

0

Предполагая, что у нас нет table names, и отсутствуют данные, вот пример запроса, который вернет то, что вы хотите. Просто измените имя поля/таблицы на все, что вы используете.

SELECT account_name 
    FROM purchaseTable 
    JOIN productTable on purchaseTable.product = productTable.id 
    WHERE MONTH(purchaseTable.purchase_date) = MONTH(productTable.purchase_date) 
    AND YEAR(purchaseTable.purchase_date) = YEAR(productTable.purchase_date) 
    HAVING COUNT(*) = 2 
    GROUP BY account_name; 
+0

Год также должен быть проверен. И нет смысла присоединяться к productTable, я думаю. – shawnt00

+0

Вы только что добавили условие YEAR(). Я знаю, что трудно угадать имена таблиц, но я думаю, что таблица продуктов вряд ли понадобится. – shawnt00

+0

Мех, я думаю, да, просто подождите и посмотрим, что предпочтет OP. –

0
select * 
from accounts 
where account_id in (
    select o.account_id 
    from orders as o inner join line_items as li on li.order_id = o.order_id 
    group by o.account_id, li.product_id, year(o.purchase_date), month(o.purchase_date) 
    having count(*) = 2 
) 

легкий способ получать информацию об учетной записи, хотя вы теряете информацию о покупке.

Вот метод, который держит информацию вместе с обоими order_ids и календарного месяца заказов:

select * 
from 
    accounts as a inner join 
    (
    select 
     o.account_id, li.product_id, 
     year(o.purchase_date) as purchase_yr, month(o.purchase_date) as purchase_mo, 
     min(o.order_id) as order_id1, max(o.order_id) as order_id2 
    from orders as o inner join line_items as li on li.order_id = o.order_id 
    group by o.account_id, li.product_id, year(o.purchase_date), month(o.purchase_date) 
    having count(*) = 2 
    ) as multiples 
     on multiples.account_id = a.account_id 
Смежные вопросы