2010-11-01 10 views
2

Je travaille dans Microsoft SQL Server 2005 et j'ai besoin de faire une analyse des joueurs qui se qualifient pour notre tournoi des 50+ les mardis -> Pour se qualifier, ils doivent obtenir 5+ points le lundi ou le mardi cette semaine avant 14h, et les points ne sont pas cumulatifs (il faut obtenir un minimum de 5 le lundi ou le mardi avant 14h). Le code que j'utilise est ci-dessous mais jusqu'à présent ne contient qu'une plage de dates pour un lundi et un mardi spécifiques. J'ai besoin de tous les lundis et mardis sur une période de 2 mois. Je suis nouveau à ce sujet (un peu jeté sur mes genoux comme un devoir supplémentaire, donc je dois apprendre à la volée) ...Comment définir une plage de dates pour 2 jours récurrents chaque semaine sur une période de 2 ou 3 mois en SQL?

Jusqu'à présent, comme je l'ai dit, j'ai pu réussir par moi-même en obtenant toutes les informations dont j'ai besoin mais ce n'est spécifique qu'à 1 semaine. Tout ce que j'ai trouvé en ligne a été jusqu'ici plus confus que je ne peux expliquer et personne n'a mentionné le code que je fourni, au lieu de me donner tout nouveau code que je ne peux pas utiliser ...

SELECT  
    dbo.CombinedPts.Account, dbo.CombinedPts.FirstName, 
    dbo.CombinedPts.LastName, 
    ISNULL(dbo.CombinedPts.EGSPts, 0) AS EGS, 
    ISNULL(dbo.CombinedPts.IRPts, 0) AS IR, 
    DATENAME(dw, dbo.CombinedPts.Date) AS WkDay, 
    DATEDIFF(YY, dbo.PlayerMaster.Birthdate, {fn current_date()}) - CASE WHEN (MONTH(dbo.PlayerMaster.Birthdate)=MONTH({fn current_date()}) AND DAY(dbo.PlayerMaster.Birthdate) > DAY({fn current_date()}) OR MONTH (dbo.PlayerMaster.Birthdate) > MONTH ({fn current_date()})) THEN 1 ELSE 0 END AS Age 
FROM  
    dbo.CombinedPts, dbo.PlayerMaster 
WHERE  
    (DATEDIFF(YY, dbo.PlayerMaster.Birthdate, {fn current_date()}) >= 50) 
    AND (dbo.CombinedPts.EGSPts >= 5 OR dbo.CombinedPts.IRPts >= 5) 
    AND (dbo.CombinedPts.Account = dbo.PlayerMaster.Account) 
    AND (Date BETWEEN '10/11/2010 00:00:00' AND '10/11/2010 13:59:59' OR Date BETWEEN '10/12/2010 00:00:00' AND '10/12/2010 13:59:59') 
    AND (DATEPART(dw, dbo.CombinedPts.Date) = 2 OR DATEPART(dw, dbo.CombinedPts.Date) = 3) 
GROUP BY 
    dbo.CombinedPts.Account, 
    dbo.CombinedPts.FirstName, 
    dbo.CombinedPts.LastName, 
    DATENAME(dw, dbo.CombinedPts.Date), 
    dbo.CombinedPts.EGSPts, 
    dbo.CombinedPts.IRPts, 
    dbo.PlayerMaster.Birthdate 
ORDER BY 
    dbo.CombinedPts.Account 

Comme une note de côté, en notre SQL Server 2005, je n'ai pas les permissions pour créer des sous-requêtes (je suis devenu un utilisateur avide de UNION ALL -> qui s'est avéré inutile dans la requête) et je n'ai pas non plus la permission de générer des tables être dans une requête ... Et jusqu'à présent, toute l'aide qui a fait sens a été d'utiliser des tables et des sous-requêtes.

+0

Quelle colonne pouvez-vous rejoindre dbo.CombinedPts, dbo.PlayerMaster sur? Exécutez-vous ceci dans Management Studio? – Vinnie

+0

Je n'étais pas au courant que les sous-requêtes étaient quelque chose qui pourrait être refusé par les autorisations ... êtes-vous sûr que c'était une erreur d'autorisations et pas une erreur de syntaxe dans votre sous-requête? – Leslie

+0

Nous l'exécutons sur un réseau et il est configuré de sorte qu'une seule personne (notre directeur informatique) puisse éditer n'importe quoi, je ne peux pas enregistrer quoi que ce soit dans SQL Server 2005, je ne peux pas créer de sous-requêtes. ne sont pas sauvegardés. Il ne cesse de me dire qu'il va le réparer pour que je puisse utiliser la vue et le design (il ne me laisse pas faire ça non plus) et ainsi je peux sauver la table et les sous-requêtes mais pas vraiment modifier les bases de données . – Hisa

Répondre

0

C'est une structure un peu différente, mais la plupart du temps identique. J'ai utilisé des alias au lieu de références complètes. Il est également non testé, mais analyse proprement. Le AND DATEDIFF(m,cp.Date,GETDATE()) < 2 vous donne la fenêtre de 2 mois.

EDIT - Ajout des clauses pour le jour et l'heure. AND (DATEPART(dw, cp.Date) in (2,3) AND DATEPART(hh,cp.Date) > 14) vous donne seulement le lundi et le mardi après 14h00 (1400 heures)

SELECT cp.Account 
, cp.FirstName 
, cp.LastName 
, ISNULL(cp.EGSPts,0) AS EGS 
, ISNULL(cp.IRPts,0) AS IR 
, DATENAME(dw, cp.Date) AS WkDay 
, DATEDIFF(YY, pm.Birthdate, GETDATE()) 
     - CASE WHEN (MONTH(pm.Birthdate) = MONTH(GETDATE()) 
     AND DAY(pm.Birthdate) > DAY(GETDATE()) 
     OR MONTH (pm.Birthdate) > MONTH (GETDATE())) 
     THEN 1 
     ELSE 0 
     END AS Age 

FROM dbo.CombinedPts cp 
join dbo.PlayerMaster pm on cp.Account = pm.Account 

WHERE DATEDIFF(YY, pm.Birthdate, GETDATE()) >= 50 
AND (cp.EGSPts >= 5 OR cp.IRPts >= 5) 
AND (DATEPART(dw, cp.Date) in (2,3) AND DATEPART(hh,cp.Date) > 14) 
AND DATEDIFF(m,cp.Date,GETDATE()) < 2 

GROUP BY cp.Account 
, cp.FirstName 
, cp.LastName 
, DATENAME(dw, cp.Date) 
, cp.EGSPts 
, cp.IRPts 
, pm.Birthdate 

ORDER BY cp.Account 
+0

Cela fonctionne et donne des paramètres corrects pour la plupart. ^^ Question, comment est-ce que je spécifie la fenêtre de 00:00:00 lundi à 13:59:59 le lundi (même chose pour mardi)? – Hisa

+0

Oh, vous avez répondu à ma question avant que je le demande! – Hisa

+0

Heureux d'aider et bienvenue sur le site! – Vinnie

0

Je ne suis pas 100% clair sur ce que vous voulez réaliser.

Je pense que vous voulez quelque chose comme ceci:

select * 
    from CombinedPts 
where CombinedPts.Date > start_of_contest 
    and CombinedPts.Date < end_of_contest 
    and (datepart(dw, CombinedPts.Date) = 2 or datepart(h, CombinedPts.Date) < 14) 
    and (datepart(dw, CombinedPts.Date) = 3 or datepart(h, CombinedPts.Date) < 14) 
having sum(CombinedPts.EGSPts) >= 5 

DATEPART est utilisé ici pour vous assurer qu'il est le jour et l'heure.

+0

Je ne suis pas 100% non plus ... ce n'est que la 2ème analyse qu'ils m'ont fait faire ... C'est plus joli que ce que j'ai vu, mais il y a plus de paramètres que ce qui est montré comme age> = 50 (trouvé uniquement dans PlayerMaster), EGS> = 5, IR> = 5, et seulement lundi ou mardi avant 14h (le reste se trouve dans CombinedPts). – Hisa