我希望有人可以帮我解决以下问题,为我的步骤制定SQL查询。
我有一个记录访客姓名和日期的简单表格。这种关系是多对多的,因为对于任何给定的日期,有许多访问者,并且对于任何给定的访问者,将有一个或多个日期(即重复访问)。有一个复杂的第三列记录了访问者与之互动的展览的名称。数据可能如下所示:
NAME ART DATE
Joe Picture 1 23-1-09
Joe Picture 2 23-1-09
Joe Picture 3 23-1-09
Janet Picture 2 23-1-09
Joe Picture 2 31-2-09
我想知道单次访问和多次访问的分布情况,换句话说,有多少人只访问过一次,有多少人在2个不同的日子访问,有多少人在3个不同的日子访问,等等。
有人可以帮忙吗?谢谢你期待!
弗兰克
答案 0 :(得分:0)
SELECT NAME, COUNT(ART) as num_exhibits, COUNT(DATE) as num_days
FROM table GROUP BY NAME;
这将为您提供每个姓名的表格,以及该姓名的总访问次数和所访问的日期总数。
要获得每个日期的平均展览,您可以这样做:
SELECT
NAME,
COUNT(ART) as num_exhibits,
COUNT(DATE) as num_days,
(num_exhibits / num_days) as avg_exhibit_per_day
FROM table GROUP BY NAME;
答案 1 :(得分:0)
如果您只想计算不同访问次数,包括同一天的多次访问次数,您可以使用:
SELECT [Name],
COUNT(*) AS Count_Dates
FROM MyTable
GROUP BY [Name]
但是,如果您不想在同一天计算多次访问,则可以使用以下内容:
SELECT [Name],
COUNT(*) AS Count_Dates
FROM
(
SELECT DISTINCT [Name],
[Date]
FROM MyTable
) a
GROUP BY [Name]
这将显示每天访问x次的总人数分布。但是,这不会显示多次访问0人的计数数字 - 例如,如果没有人访问过8次,则Count_Dates = 8将不会有一行。如果您确实要显示0的完整列表-10次访问,您可以创建Count_Dates的临时表并插入0-10的值,然后将其用作主查询的一部分。
SELECT Count_Dates,
COUNT(*) AS Count_Visitors
FROM (SELECT [Name], COUNT(DISTINCT [Date]) AS Count_Dates FROM MyTable GROUP BY [Name]) a
GROUP BY Count_Dates
ORDER BY Count_Dates