Sql 寻找一个月内至少购买两次相同产品的人

Sql 寻找一个月内至少购买两次相同产品的人,sql,sql-server,tsql,Sql,Sql Server,Tsql,例如,如果我有这些数据: ProductName ServiceDate Name StockId Fee LG 1/10/2011 John 1 0 Sony 2/20/2011 Mike 2 0 LG 1/11/2011 John 1 0 Samsung 2/21/2011 St

例如,如果我有这些数据:

ProductName     ServiceDate   Name   StockId   Fee

LG                1/10/2011    John   1         0 
Sony              2/20/2011    Mike   2         0 
LG                1/11/2011    John   1         0
Samsung           2/21/2011    Steve  3         0 
Toshiba           3/2/2011     Kelly  4         0 
LG                5/6/2011     Sean   1         0   

现在想象一下有数百万条记录。我如何找到在同一个月内用同一库存ID购买了2种或更多产品的人

这可以使用
GROUP BY
语句来完成。 唯一的问题是您必须使用
MONTH
YEAR
函数将
日期转换为可用格式以分组

SELECT  Name
FROM    Products
GROUP BY
        MONTH(ServiceDate)
        , YEAR(ServiceDate)
        , StockID
        , Name
HAVING  COUNT(*) >= 2        

此查询应提供姓名和股票id的列表,其中姓名在指定月份购买了2个或更多股票id

SELECT Name, StockId
FROM table
WHERE YEAR(ServiceDate) = 2011 AND MONTH(ServiceDate) = 2
GROUP BY Name, StockId
HAVING COUNT(Name)> 1

您可以使用下面的查询

create table sales 
(ProductName varchar(10),
ServiceDate date,
Name varchar(10),
StockId number(10)
);



insert into sales values('LG',to_date('10-01-2011','dd-mm-yyyy'),'John' ,1);
insert into sales values('Sony',to_date('20-02-2011','dd-mm-yyyy'),'Mike' ,2);
insert into sales values('LG',to_date('11-01-2011','dd-mm-yyyy'),'John' ,1);
insert into sales values('Samsung',to_date('21-02-2011','dd-mm-yyyy'),'Steve' ,3);
insert into sales values('Toshiba',to_date('02-03-2011','dd-mm-yyyy'),'Kelly' ,4);
insert into sales values('LG',to_date('06-05-2011','dd-mm-yyyy'),'Sean' ,1) ; 
insert into sales values('Sony',to_date('11-01-2011','dd-mm-yyyy'),'John' ,1);
查询:

 select name from sales group by to_char(servicedate,'YYYYMM'),stockid,name having count(*) > 2;

我们可以假设同一年的同一个月吗?嗨,谢谢你的回复。我猜你的查询会给我一个月的结果(如果我错了,请纠正我),但如果它有数百万条记录,那么我如何找出所有月份的结果?@jojo完全按照此答案中的查询进行操作,你就会得到你所要求的结果。也许你没有得到你想要的所有字段,但是你得到了你想要的所有字段。@jojo-你错了:)最简单的方法是尝试查询并验证结果。
 select name from sales group by to_char(servicedate,'YYYYMM'),stockid,name having count(*) > 2;