在SQL查询中混淆count()子句

时间:2011-01-31 10:25:59

标签: sql-server-2008

我需要一些查询帮助(对不起,我不太擅长这个!)

我有一张表:

productid    userid     DateTracked
```````````````````````````````````
1             1          2010-09-11
2             1          2010-09-11
3             1          2010-09-11
4             1          2010-09-11
1             2
2             2
1             1          2010-09-13
2             1          2010-09-13

所以,我想计算每个用户购买每种产品的次数。实际上,我想选择多次从网站上购买的用户数量。 这根本不是产品用户ID的东西,我只是尽我所能地解释这个场景。

这里,Userid 1与pid 1,2,3,4相关联,然后又在另一个日期与1,2相关联。

我试过

select count(*) from MyTable group by ProductID

它给了我一个数字列表,我不确定它们表示什么,或者这就是我想要的,查询是否正确?

编辑简化:有日期,我想要选择的是次数,用户ID在不同日期重复。在上表中,userid 1有两个计数 - 一个用于日期11,一个用于13.我有x个用户ID。

我认为这可以更准确地解释我的问题。抱歉。 那么如何选择具有不同日期的所有用户ID的计数?

非常感谢

6 个答案:

答案 0 :(得分:2)

代码

select count(*) from MyTable group by ProductID

仅返回单个产品ID的计数,不提供与其相关的产品的信息。

select ProductID, count(*) as cnt from MyTable group by ProductID

为您提供productID及其相应的计数

获取用户购买的产品数量

select UserID, count(*) as cnt from MyTable group by UserID

获取用户购买特定产品的次数

Select UserID, ProductID, Count(*) as cnt from MyTable group by UserID, ProductID

答案 1 :(得分:1)

计算用户购买数量

包含已注释的行,仅包含已购买超过1件的用户。

with Pur as
(
    select UserID, DateTracked
    from Purchase
    group by UserID, DateTracked
)
select UserID, count(DateTracked) as NumberOfPurchases
from Pur
group by UserID
-- having count(DateTracked) > 1

这也可以进一步简化:

select UserID, count(distinct DateTracked)
from Purchase
group by UserID;

我没有检查过他们的执行计划,但第二个可能更快。第二个只计算每个用户的不同购买日期,这是您的主要目标。

计算产品购买数量

如果用户每次购买可以购买多个相同的产品,则应使用此查询:

select ProductID, count(*)
from Purchase
group by ProductID;

如果您只想计算购买时包含某种产品的购买次数,则应使用以下查询:

select ProductID, count(distinct DateTracked)
from Purchase
group by ProductID;

答案 2 :(得分:1)

按功能分组与您的聚合函数Count(*)一起使用,以对适合您的组的数据集执行聚合函数。您正在计算表中每个productId出现的次数。见http://www.w3schools.com/sql/sql_groupby.asp

如果您想知道每个计数的含义,您应该包含ProductId

SELECT ProductId, Count(*)
FROM MyTable
GROUP BY ProductId

如果您只对特定尺寸或特定类型的产品感兴趣,可以使用 WHERE HAVING 条款进一步限制。

SELECT ProductId, Count(*)
FROM MyTable
WHERE ProductType = 'MyType'
GROUP BY ProductId
HAVING Count(*) > 3

修改 有关按日期和userId分组的更新问题,您需要以下内容。

SELECT UserId, Date, COUNT(*)
FROM MyTable
GROUP BY UserId, Date

注意:如果将Date列存储为DATETIME,则需要将Date列转换为group by子句的DATE类型,以便为您提供所期望的结果!

答案 3 :(得分:0)

您正在计算按ProductID分组的计数,但您没有指明哪个计数属于哪个ProductID。只需将ProductID包含为输出列:

select ProductID, count(*) from MyTable group by ProductID

但是,基于您的问题,您实际上并不想按产品计算。如果您想要计算用户购买东西的不同日期的数量,请按用户ID分组并计算不同的日期:

select UserID, COUNT(DISTINCT DateTracked) from MyTable group by UserID

答案 4 :(得分:0)

您可以使用声明
SELECT productid, userid, count(*) FROM MyTable GROUP BY productid, userid

答案 5 :(得分:0)

如果你只是看看每个用户如何使用它: SELECT userid,COUNT(productid) FROM tbl GROUP BY userid 我想这会给你:用户ID和他们购买的商品数量...... 你可以写: SELECT userid,COUNT(productid) AS cc FROM tbl GROUP BY userid HAVING cc > 1 那么你只会得到不止一次购买的用户的ID和项目数......