0

Recherche d'une seule requête à utiliser éventuellement dans un rapport SQL Server 2005. J'ai besoin de:SQL Server 2005 - requête avec l'instruction case

  1. Tirez dans tous les enregistrements distincts pour les valeurs dans la colonne "eventid" pour un laps de temps - cela semble fonctionner.
  2. Pour chaque eventid référencé ci-dessus, j'ai besoin de rechercher toutes les instances du même eventid pour voir s'il existe un autre enregistrement avec TaskName comme 'review1%'. Encore une fois, cela semble fonctionner.
  3. C'est là que les choses se compliquent: Pour chaque enregistrement où TaskName est comme review1, j'ai besoin de voir si un autre enregistrement existe avec le même eventid et où TaskName = 'End'. En fin de compte, j'ai besoin de compter combien d'enregistrements ont TaskName comme 'review1%', et puis combien ont TaskName comme 'review1%' AND TaskName = 'End'. Je pense que cela pourrait être accompli en définissant une nouvelle valeur pour chaque enregistrement, et pour l'eventid, si un enregistrement existe avec TaskName = 'End', mettre à 1, et sinon, mettre à 0.

la requête semble ci-dessous pour atteindre le point 1 ci-dessus:

SELECT eventid, TimeStamp, TaskName, filepath 
FROM (SELECT eventid, TimeStamp, filepath, TaskName, 
ROW_NUMBER() OVER(PARTITION BY eventid 
ORDER BY TimeStamp DESC) 
AS seq 
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000'))) AS T 
WHERE seq = 1 order by eventid 

Et la requête semble ci-dessous pour accomplir # 2:

SELECT eventid, TimeStamp, TaskName, filepath 
FROM (SELECT eventid, TimeStamp, filepath, TaskName, 
ROW_NUMBER() OVER(PARTITION BY eventid 
ORDER BY TimeStamp DESC) 
AS seq 
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T 
WHERE seq = 1 order by eventid 

Cela ramènera les années eventid qui ont également TaskName = « End » :

SELECT eventid, TimeStamp, TaskName, filepath 
FROM (SELECT eventid, TimeStamp, filepath, TaskName, 
ROW_NUMBER() OVER(PARTITION BY eventid 
ORDER BY TimeStamp DESC) 
AS seq 
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T 
WHERE seq = 1 
and eventid in 
(Select eventid from 
eventrecords 
where TaskName = 'End') 
order by eventid 

J'ai essayé ce qui suit pour essayer d'accomplir # 3:

SELECT eventid, TimeStamp, TaskName, filepath 
FROM (SELECT eventid, TimeStamp, filepath, TaskName, 
ROW_NUMBER() OVER(PARTITION BY eventid 
ORDER BY TimeStamp DESC) 
AS seq 
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T 
WHERE seq = 1 
and 
case 
when (eventid in 
(Select eventid from 
eventrecords 
where TaskName = 'End') then 1 
else 0) as bit 
end 
order by eventid 

Lorsque je tente de lancer, je reçois: « syntaxe incorrecte près du mot-clé « puis ». » Je ne sais pas ce que je fais mal. Je n'ai pas vu d'exemple nulle part comme ça.

Je dois mentionner que eventrecords a une clé primaire, mais cela ne semble pas aider quand je l'inclue, et je ne suis pas autorisé à changer la table. (ugh) J'ai reçu une suggestion pour utiliser un curseur et une table temporaire, mais je ne suis pas sûr de savoir comment cela pourrait ralentir les performances lorsque le rapport est en cours d'exécution. Merci d'avance.

Répondre

0

Il n'est pas nécessaire de convertir le résultat de IN en nombre entier. Vous pouvez simplement faire ceci:

and eventid in (
    Select eventid from 
    eventrecords 
    where TaskName = 'End' 
) 
+0

Mark, j'essaie de vérifier si un nom de tâche avec le même attribut existe, et je veux qu'il affiche un oui/non , vrai/faux type de valeur. Si je laisse la requête comme vous l'avez, elle ramènera simplement tous les eventid qui ont un enregistrement avec TaskName comme 'Review1%' et un autre enregistrement avec TaskName = 'End'. Je devrai obtenir les valeurs totales des enregistrements avec 'End' et ceux sans End dans mon rapport. – user329266

+0

@ user329266: Je voudrais aider plus mais votre question est plutôt difficile à suivre.Je peux vous aider davantage si vous publiez a) toutes vos définitions de tables b) quelques instructions SQL qui insèrent des données de test dans ces tables, par ex. 10 lignes pour chaque tableau c) la sortie requise de la requête lors de l'exécution sur les données de test –

0

Essayez d'ajouter une autre parenthèse après 'End'), comme 'End')) et enlever la parenthèse après la 0, comme else 0 as bit end

+0

Essayé cela. Maintenant, il lance ce qui suit: 'Syntaxe incorrecte près du mot clé' as '.' – user329266

0

Si je comprends bien vous la question que vous serez en mesure de cela avec une sous-requête entourée d'un CAS. La sous-requête vérifie s'il y a un (ou plusieurs) enregistrements dans la même période et avec le même eventid qui a un TaskName = 'End'. Ensuite, si une telle ligne existe, la clause CASE renvoie 1 et sinon 0.

SELECT eventid, 
     TimeStamp, 
     TaskName, 
     filepath, 
     CASE WHEN EXISTS (SELECT 1 FROM eventrecords WHERE TaskName = 'End' and TimeStamp BETWEEN '2010-04-01' AND '2010-04-21' and eventid = T.eventid) THEN 1 ELSE 0 END as TaskNameEndExists 
FROM (SELECT eventid, TimeStamp, filepath, TaskName, 
     ROW_NUMBER() OVER(PARTITION BY eventid ORDER BY TimeStamp DESC) AS seq 
     FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T 
WHERE seq = 1 
order by eventid