2011-06-30 11 views
0

Ma requête renvoie trop de données. Voici la requête, quelques exemples de données et un échantillon de ce que j'aimerais vraiment.Affiner la requête SQL

select sd.ident,sd.suniq, td.testc, td.testuniq, td.subtestc, ts.testscore, ud.metadept, max(ts.takendt)AS testdate 
from studemo sd, stutests ts, testdef td, udefstu ud 
where ts.suniq =sd.suniq 
and td.testuniq = ts.testuniq 
and ts.suniq = ud.suniq 
and td.testuniq IN ('2000089', '2000090', '2000091', '2000092') 
group by sd.suniq, sd.ident, td.testc, td.subtestc, ts.testscore, ud.metadept, ts.takendt, td.testuniq 
order by suniq 

Exemple de sortie

ident suniq testc testuniq subtestc testscore metadept testdate 
102201 2001444 ADEPT 2000091 L3 23 NULL 09/01/2006 00:00 
102201 2001444 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
101184 2001532 ADEPT 2000092 L4 5 NULL 09/01/2006 00:00 
101184 2001532 ADEPT 2000092 L4 7 NULL 06/01/2006 00:00 
101184 2001532 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
590122 2001950 ADEPT 2000091 L3 22 NULL 06/01/2007 00:00 
590122 2001950 ADEPT 2000090 L2 32 NULL 09/01/2006 00:00 
141058 2004980 ADEPT 2000089 L1 27 NULL 05/01/2006 00:00 
141058 2004980 ADEPT 2000090 L2 28 NULL 01/25/2008 00:00 
141058 2004980 ADEPT 2000090 L2 27 NULL 06/01/2007 00:00 

sortie Recherché

102201 2001444 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
101184 2001532 ADEPT 2000092 L4 7 NULL 06/01/2007 00:00 
590122 2001950 ADEPT 2000091 L3 22 NULL 06/01/2007 00:00 
141058 2004980 ADEPT 2000090 L2 28 NULL 01/25/2008 00:00 
+0

Pouvez-vous s'il vous plaît expliquer la logique derrière la sortie de l'échantillon? Pourquoi 'testuniq = '2000089'' n'est-il pas inclus dans la sortie de l'échantillon même si cette valeur est listée dans la clause' IN'? –

+0

Quelle est la différence entre l'échantillon et voulu? On dirait que vous cherchez la rangée avec le dernier 'testdate' mais il pourrait être quelque chose de différent –

+0

Peut-être que je ne peux pas sembler comprendre ce que vous voulez ... mais ... quel genre de raffinage voulez-vous? Voulez-vous juste moins de résultats? Ou y at-il quelque chose de spécial au sujet des 4 résultats que vous voulez qui devrait être recherché? –

Répondre

0

Essayez ceci. Vous avez trop de critères GROUP BY et vous avez besoin d'agrégats dans les champs restants. De vous désiriez ils ont tous la sortie ressembler MAX valeurs à moi:

select sd.ident, 
     sd.suniq, 
     td.testc, 
     MAX(td.testuniq) as TestUniq, 
     MAX(td.subtestc) as Subtestc, 
     MAX(ts.testscore) as TestScore, 
     MAX(ud.metadept) as metadept, 
     max(ts.takendt)AS testdate 
from studemo sd, stutests ts, testdef td, udefstu ud 
where ts.suniq =sd.suniq 
and td.testuniq = ts.testuniq 
and ts.suniq = ud.suniq 
and td.testuniq IN ('2000089', '2000090', '2000091', '2000092') 
group by sd.suniq, sd.ident, td.testc, 
order by suniq 
0

Je pense que je sais ce que vous êtes après, vous essayez d'obtenir pour afficher uniquement les plus récentes (ou valeur la plus élevée) article ... ont vous avez essayé le mot clé "distinct"? Si j'avais un jeu de données de test pour essayer quelques requêtes, je serais en mesure de vous obtenir la bonne réponse assez rapidement, mais en la tirant du haut de ma tête est une autre histoire

sélectionnez distinct sd.ident, sd.suniq , td.testc, td.testuniq, td.stestc, ts.testscore, ud.metadept, max (ts.takendt) AS testdate à partir de studemo sd, stutests ts, testdef td, udefstu ud où ts.suniq = sd. suniq et td.testuniq = ts.testuniq et ts.suniq = ud.suniq et td.testuniq IN ('2000089', '2000090', '2000091', '2000092') groupe par sd.suniq, sd .ident, td.testc, td.subtestc, ts.testscore, ud.metadept, ts.takendt, td.testuniq ordre par suniq desc

+0

'DISTINCT' obtiendra juste lui des combinaisons uniques des champs que vous avez spécifiés, qui seraient tous les champs. – JNK