2009-09-23 7 views
0

Permettez-moi d'expliquer au mieux de mes capacités:requête SQL besoin pour obtenir l'utilisateur où la colonne de programme comprend certains programme

J'ai une table où il y a une colonne userID et une colonne de programme (avec autres colonnes de non-importance). J'ai besoin de trouver les utilisateurs dans cette table qui ont plusieurs instances dans cette table où cet utilisateur a un programme de X qui lui est associé.

Quelqu'un peut-il m'aider s'il vous plaît?

Ce que j'ai à ce jour est:

SELECT 
      WPP.USERID 
     FROM 
      WEBPROGRAMPARTICIPANTS WPP 
     INNER JOIN 
      WEBPROGRAMS WP 
     ON 
      WPP.PROGRAMCODE = WP.PROGRAMCODE 
     WHERE 
      CONFIRMED = 1 AND 
      WP.PROGRAMTYPE IN ('1') AND 
      WP.PROGRAMSTARTDATE >= '2000-01-01' AND 
      WPP.PROGRAMCODE = 'CL2010' 
     GROUP BY 
      WPP.USERID 
     HAVING 
      COUNT(WPP.PROGRAMCODE) > 1 

Répondre

1
DECLARE @Program VARCHAR(MAX) 

SET @Program = 'X' 

SELECT UserID, COUNT(Program) Duplicates 
FROM Table 
WHERE Program = @Program 
AND COUNT(Program) > 1 
GROUP BY UserID 
0

Je pense que tous vos disparus est un groupe par wpp.programcode a bien

SELECT 
         WPP.USERID 
       FROM 
         WEBPROGRAMPARTICIPANTS WPP 
       INNER JOIN 
         WEBPROGRAMS WP 
       ON 
         WPP.PROGRAMCODE = WP.PROGRAMCODE 
       WHERE 
         CONFIRMED = 1 AND 
         WP.PROGRAMTYPE IN ('1') AND 
         WP.PROGRAMSTARTDATE >= '2000-01-01' AND 
         WPP.PROGRAMCODE = 'CL2010' 
       GROUP BY 
         WPP.USERID , WPP.PROGRAMCODE 
       HAVING 
         COUNT(WPP.PROGRAMCODE) > 1 

Si vous ne souhaitez pas limiter à programcode cl2010 déposez-le de la clause where. Je voudrais également ajouter wpp.programcode à votre liste de sélection afin que vous puissiez voir quels codes sont dupliqués et compter (wpp.programcode) si vous voulez voir combien de fois.

+0

J'ai besoin programcode de CL2010 parce que je suis en train de trouver les utilisateurs qui ont attanded programmes mutliple dont ce programme – mattgcon

+0

C'est bien, mais il vous limitera également à ce programme – Gratzy

0

Vous allez probablement devoir faire cela comme une sous-requête car une fois que vous ajoutez dans une clause where limitant vos résultats à un type de programme spécifique, vous ne pourrez trouver des participants qui ont plusieurs lignes de ce programme type. Vous cherchez probablement quelque chose comme ceci:

SELECT 
    WPP.USERID 
FROM 
    WEBPROGRAMPARTICIPANTS WPP 
INNER JOIN 
    WEBPROGRAMS WP ON WPP.PROGRAMCODE = WP.PROGRAMCODE 
WHERE 
    CONFIRMED = 1 AND 
    WP.PROGRAMTYPE IN ('1') AND 
    WP.PROGRAMSTARTDATE >= '2000-01-01' AND 
    WPP.PROGRAMCODE = 'CL2010' 
    WPP.USERID IN (
     SELECT 
      WPP.USERID 
     FROM 
      WEBPROGRAMPARTICIPANTS WPP 
     GROUP BY 
      WPP.USERID 
     HAVING 
      COUNT(WPP.PROGRAMCODE) > 1) 
GROUP BY 
    WPP.USERID 
+0

J'ai essayé cette suggestion, cependant, il revient plus que prévu – mattgcon

+1

Que voulez-vous dire plus de retour que prévu? Plusieurs ID utilisateur retournés ou USERID qui ne correspondent pas à vos critères? Je pense que vous avez probablement la première erreur, et je peux voir pourquoi je suis en train de mettre à jour pour corriger cela. –

0

Je suppose qu'il est de ne pas trouver les doublons, même si vous les connaissez exister. Avec votre requête, si votre doublon a un type, un code ou une date de début différents avant le 2000-1-1, ces enregistrements seront filtrés avant d'exécuter votre décompte. Gardez à l'esprit que cela va appliquer le «où» assez tôt dans le processus.

Gardez cet ordre de traitement à l'esprit: http://tinman.cs.gsu.edu/~raj/sql/node22.html

Questions connexes