2016-05-04 37 views
0

可以說我有一個表SALES查詢顯示,如果客戶購買了在同一天同一artictle

Date   ArticleID CustomerID SalesID 
2016-04-01  4   1000  1 
2016-04-01  8   1000  2 
2016-04-01  4   1000  3 
2016-04-01  12   1000  4 
2016-04-02  4   1000  5 
2016-04-03  6   800  6 
2016-04-03  4   1000  7 
2016-04-05  99   900  8 
2016-04-06  4   700  9 

我的目標是使返回只有在同一客戶買了同樣的行的查詢文章在同一天。

在這種情況下,結果應該是:

Date   ArticleID CustomerID SalesID 
2016-04-01  4   1000  1 
2016-04-01  4   1000  3 

我怎樣寫這個查詢的最佳方式?感謝幫助!

回答

3

你可以做,使用GROUP BYHAVING

SELECT t.* 
FROM tbl t 
INNER JOIN (
    SELECT CustomerID, Date, ArticleID 
    FROM tbl 
    GROUP BY CustomerID, Date, ArticleID 
    HAVING COUNT(SalesID) >= 2 
)a 
    ON a.CustomerID = t.CustomerID 
    AND a.Date = t.Date 
    AND a.ArticleID = t.ArticleID 

另一種方法是使用COUNT OVER

WITH Cte AS(
    SELECT *, 
     cnt = COUNT(SalesID) OVER(PARTITION BY CustomerID, Date, ArticleID) 
    FROM tbl 
) 
SELECT 
    Date, ArticleID, CustomerID, SalesID 
FROM Cte 
WHERE cnt >= 2 

ONLINE DEMO

+1

打我的編輯:-)我要發佈幾乎同樣的事情:-) –

1

一種方法是使用CTE做與group byhaving,然後再加入到原始表:

;WITH CTE AS 
(
SELECT Date, ArticleId, CustomerId 
FROM Sales 
GROUP BY Date, ArticleId, CustomerId 
HAVING COUNT(SalesId) > 1 
) 

SELECT S.Date, S.ArticleId, S.CustomerId, S.SalesId 
FROM Sales S 
INNER JOIN CTE C ON(S.Date = C.Date AND S.ArticleId = C.ArticleId AND S.CustomerId = C.CustomerId) 
1

請嘗試以下查詢

select date,articleid,customerid,salesid from sales 
inner join 
(select date,articleid,customerid 
from sales 
group by date,articleid,customerid 
having count(1)>1) b 
on sales.date=b.date 
and sales.articleid=b.articleid 
and sales.customerid=b.customerid 
1

使用子查詢做到這一點。

SELECT A.* 
FROM YourTable AS A INNER JOIN (
SELECT Date, ArticleID, CustomerID, COUNT(*) AS NumberOfCount 
FROM YourTable 
GROUP BY Date, ArticleID, CustomerID 
HAVING COUNT(*) >1) AS B 
ON A.Date = B.Date 
AND A.ArticleID = B.ArticleID 
AND A.CustomerID = B.CustomerID 
1

你可以在下面使用COUNT()OVER

select Date_, ArticleID, CustomerId, SalesID 
from (select *, 
      count(*) over(partition by Date_, ArticleID, CustomerId) cnt 
     from #t)x 
where cnt > 1