2011-06-09 28 views
1

我有一個如下所示的表格。它是每日特色產品和購買它們的客戶的記錄(類似於每日交易網站)。一個給定的客戶只能每個功能一次購買一個產品,但如果它有多個功能,他們可能會購買相同的產品。SQL:如何計算已購買同一產品的客戶端數量?

FeatureID | ClientID | FeatureDate | ProductID 
1   1002  2011-05-01  500 
1   2333  2011-05-01  500 
1   4458  2011-05-01  500 
2   8888  2011-05-10  700 
2   2333  2011-05-10  700 
2   1111  2011-05-10  700  
3   1002  2011-05-20  500 
3   4444  2011-05-20  500 
4   4444  2011-05-30  500 
4   2333  2011-05-30  500 
4   1002  2011-05-30  500 

我想FeatureID和採購的FeatureID和X,誰是以前的功能,在購買同一客戶的productID的數量來算。

的預期結果上面的表格是:

FeatureID | CountofReturningClients 
1   0 
2   0 
3   1 
4   3 

理想情況下,我想用SQL做到這一點,但我也願意在Excel/PowerPivot的做一些操作。謝謝!!

+0

SQL到Excel中,從什麼?或從一個數據庫(哪個?)到Excel?在標準的SQL中,它很簡單... – gbn 2011-06-09 21:04:40

+0

對不起,對此並不清楚,這意味着如果我有Excel中的原始數據,我會公開反饋如何將其轉換爲我正在尋找的格式。但是,你說得對,查詢很簡單:)感謝所有人的幫助!非常感激。 – Lao 2011-06-09 23:20:29

回答

1

如果你加入你的表本身,你可以找到你要找的數據。要小心,因爲如果表有大量數據並且索引不好,則此查詢可能需要很長時間。

SELECT t_current.FEATUREID, COUNT(DISTINCT t_prior.CLIENTID) 
FROM table_name t_current 
LEFT JOIN table_name t_prior 
ON t_current.FEATUREDATE > t_prior.FEATUREDATE 
AND t_current.CLIENTID = t_prior.CLIENTID 
AND t_current.PRODUCTID = t_prior.PRODUCTID 
GROUP BY t_current.FEATUREID 
+0

非常感謝!這工作完美。 – Lao 2011-06-09 23:12:02

0

「每功能,匹配算誰的客戶具有相同產品的任何早期功能」

SELECT 
    Curr.FeatureID 
    COUNT(DISTINCT Prev.ClientID) AS CountofReturningClients --edit thanks to feedback 
FROM 
    MyTable Curr 
    LEFT JOIN 
    MyTable Prev WHERE Curr.FeatureID > Prev.FeatureID 
         AND Curr.ClientID = Prev.ClientID 
         AND Curr.ProductID = Prev.ProductID 
GROUP BY 
    Curr.FeatureID 
+1

您需要在其中添加一個「DISTINCT」 - 對於功能4,這將返回4,因爲它計算客戶端#1002兩次。 – dpmattingly 2011-06-09 21:11:45

+0

@dpmattingly:是的,現在看,謝謝 – gbn 2011-06-09 21:13:12

-1

剛接觸這個,但不會做以下工作嗎?

SELECT  FeatureID, (CASE WHEN COUNT(clientid) > 1 THEN COUNT(clientid) ELSE 0 END) 
FROM   table 
GROUP BY featureID 
+0

這將返回每個功能的客戶數量,期間。他希望每個功能的回頭客的數量。 – dpmattingly 2011-06-09 21:17:21

0

假設:您有一個稱爲功能表,它是:

FeatureID的,FeatureDate,產品ID

如果沒有,那麼你總是可以動態創建一個具有臨時表,CTE或視圖。

然後:

SELECT 

FeatureID 

, (
    SELECT COUNT(DISTINCT ClientID) FROM Purchases WHERE Purchases.FeatureDate < Feature.FeatureDate AND Feature.ProductID = Purchases.ProductID 

) as CountOfReturningClients 

FROM Features 
ORDER BY FeatureID 
相關問題