简单的SQL(希望!)查询问题

时间:2009-10-04 14:23:49

标签: sql mysql

我希望有人可以帮我解决以下问题,为我的步骤制定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个不同的日子访问,等等。

有人可以帮忙吗?谢谢你期待!

弗兰克

2 个答案:

答案 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