2015-02-10 60 views
0

我试图在相同的日历月内显示一个帐户列表,其中有两个相同的产品已经为同一个帐户订购。SQL - 根据多个条件检索数据

字段名称:

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

我已经使用GROUP BY和HAVING,但我关心的记录容量返回。

+3

请编辑您的问题,说明你正在使用的查询,并解释为什么你是“关心返回的记录量“。 – 2015-02-10 17:51:48

+0

我在猜测订单ID字段是什么扔掉你,删除该字段。你也有计数字段为> 1? – JB13 2015-02-10 17:55:31

+0

你正在使用哪些DBMS? Postgres的?甲骨文? – 2015-02-10 18:52:53

回答

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) 

我只是想指出,你必须同时匹配的几个月和几年,以避免与2015分之1

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

年份也需要检查。没有意义加入到我认为的产品中。 – shawnt00 2015-02-10 18:18:55

+0

您刚刚添加了YEAR()条件。我知道很难猜测表名,但我认为产品表不可能是必需的。 – shawnt00 2015-02-10 18:24:45

+0

恩,我想是的,让我们拭目以待,看看OP会更喜欢什么。 – 2015-02-10 18:25:30

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