SQL:我如何计算已购买相同产品的客户数量?

时间:2011-06-09 21:02:15

标签: sql excel

我有一张如下表所示的表格。它是每日特色产品和购买它们的客户的记录(类似于每日交易网站)。给定的客户每个功能只能购买一次产品,但如果多次推出,他们可能会购买相同的产品。

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的客户数量以及在之前的功能中购买相同产品ID的客户数量。

对于上表,预期结果为:

FeatureID | CountofReturningClients  
 1          0  
 2          0  
 3          1  
 4          3

理想情况下我想用SQL做这件事,但我也愿意在Excel / PowerPivot中做一些操作。谢谢!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

假设:您有一个名为Features的表:

FeatureID,FeatureDate,ProductID

如果没有,那么您可以随时使用临时表,cte或view创建一个。

然后:

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

答案 3 :(得分:-1)

对此有所了解,但不会有以下工作吗?

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