Простой SQL (надеюсь!) Вопрос запроса - PullRequest
2 голосов
/ 04 октября 2009

Я надеюсь, что кто-то может помочь мне с моими ошибочными шагами сформулировать запрос 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 отдельных дня и т. Д.

Может кто-нибудь помочь, пожалуйста? Спасибо в ожидании!

Frankie

Ответы [ 2 ]

0 голосов
/ 04 октября 2009

Если вы хотите подсчитать только общее количество отдельных посещений, включая несколько посещений в одну и ту же дату, вы можете использовать:

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
0 голосов
/ 04 октября 2009
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...