2009-10-04 8 views
2

J'espère que quelqu'un peut m'aider avec mes étapes hésitantes pour formuler une requête SQL pour le problème suivant.Simple SQL (j'espère!) Query Question

J'ai un simple tableau qui enregistre les noms et dates des visiteurs. La relation est de plusieurs à plusieurs, en ce sens que pour une date donnée, il y a beaucoup de visiteurs, et pour un visiteur donné il y aura une ou plusieurs dates (c'est-à-dire des visites répétées). Il y a une troisième colonne compliquée qui enregistre le nom de la ou des expositions avec lesquelles le visiteur a interagi. Les données pourraient ressembler à ceci:

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 

Je veux savoir ce que la répartition des visites uniques et multiples sont, autrement dit, combien de personnes n'ont effectué une visite, combien de personnes ont visité 2 jours différents, combien sur 3 jours séparés, et ainsi de suite.

Quelqu'un peut-il vous aider s'il vous plaît? Merci d'avance!

Frankie

+4

Peut-être pourriez-vous nous indiquer le code que vous avez écrit jusqu'ici? Les gens n'aiment généralement pas écrire votre code pour vous ... –

Répondre

0
SELECT NAME, COUNT(ART) as num_exhibits, COUNT(DATE) as num_days 
FROM table GROUP BY NAME; 

Cela vous donnera une table de chaque nom ainsi que le nombre total de visites pour ce nom et le nombre total de dates visitées.

Pour obtenir une exposition moyenne par jour, vous pouvez faire:

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; 
0

Si vous voulez seulement compter le nombre total de visites distinctes, y compris plusieurs visites à la même date, vous pouvez utiliser:

SELECT [Name], 
COUNT(*) AS Count_Dates 
FROM MyTable 
GROUP BY [Name] 

Cependant, si vous ne voulez pas compter plusieurs visites à la même date, vous pouvez utiliser les éléments suivants:

SELECT [Name], 
COUNT(*) AS Count_Dates 
FROM 
(
    SELECT DISTINCT [Name], 
    [Date] 
    FROM MyTable 
) a 
GROUP BY [Name] 

Ceci vous montrera la distribution du nombre total de personnes qui ont visité x fois par jour. Cependant, ceci n'affiche pas les nombres pour les comptes où 0 personnes ont visité autant de fois - par exemple, si personne n'a visité 8 fois, alors il n'y aura pas de ligne pour Count_Dates = 8. Si vous voulez afficher une liste complète de 0 -10 visites, vous pouvez créer une table temporaire de Count_Dates et insérer des valeurs de 0 à 10, puis l'utiliser comme partie de la requête principale.

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

Merci à tous, mais seulement Flayto comprend ce que je veux. Combien de personnes ont visité deux fois, combien de personnes ont visité 3 fois, 4 fois, etc.? On s'attendrait à ce que la plupart des gens visitent une fois et un nombre décroissant à visiter au plus grand nombre de fois. Flayto, en transposant votre deuxième exemple dans les valeurs réelles utilisées dans ma base de données J'obtiens: SELECT avatar, COUNT (*) AS Count_Dates FROM (SELECT DISTINCT avatar, date FROM artbox) GROUP BY avatar; Et le message d'erreur qui en résulte dit: # 1248 - Chaque table dérivée doit avoir son propre alias Pouvez-vous jeter une lumière sur ce s'il vous plaît? Je vous remercie. –

+0

La sous-requête entre parenthèses doit avoir un alias - dans mon exemple, j'ai ajouté la lettre "a" après les parenthèses fermantes. Je ne me souviens pas si dans MySQL vous devez utiliser le mot-clé "AS" - essayez d'ajouter juste un alias, et si cela ne fonctionne pas, ajoutez "AS" avant le nom de l'alias. – flayto

+0

COUNT (DISTINCT Date) enregistrerait la sous-requête. –