Utiliser Oracle DB. J'essaie de prendre des données dans une colonne (Name) et de faire ces données les noms de colonne et de définir les données dans une autre colonne (STS.Numscore) les données de la colonne (T.Name). J'utilise des déclarations de cas mais cela ne fonctionne pas. Les déclarations de cas mettent un score de test par ligne. J'ai besoin de tous les scores de test sur une rangée. Toute aide serait grandement appréciée. Merci
3 Réponses :
Vous devez utiliser une agrégation conditionnelle comme ci-dessous-
SELECT schools.name AS School, s.lastfirst AS Student, s.student_number, s.grade_level, t.name AS Test_Name, max(case when ts.name = 'ACT_Reading' then sts.numscore end) as ACT_Reading, max(case when ts.name = 'ACT_Math' then sts.numscore end) as ACT_Math, max(case when ts.name = 'ACT_English' then sts.numscore end) as ACT_English, max(case when ts.name = 'ACT_Science' then sts.numscore end) as ACT_Science, max(case when ts.name = 'ACT_Composite' then sts.numscore end) as ACT_Composite, to_char (st.test_date), sts.numscore AS Score FROM students s join studenttestscore sts on s.id = sts.studentid join studenttest st on sts.studenttestid = st.id join test t on sts.testscoreid = ts.id join testscore ts on ts.testid = t.id join schools on s.schoolid = schools.school_number WHERE t.name = 'ACT' AND sts.numscore > 0 and s.enroll_status=0 AND s.schoolid=10 group by schools.name, s.lastfirst , s.student_number, s.grade_level, t.name, to_char (st.test_date),sts.numscore ORDER BY s.lastfirst,st.test_date DESC
Merci pour la réponse! J'ai couru la requête mais cela n'a pas retourné des rangées.
Pour obtenir les résultats en une seule ligne, vous devez regrouper les résultats des expressions de cas; Quelque chose comme: Comme vous pivotant efficacement le score, vous ne voulez pas inclure cela comme sa propre colonne, dans la liste Sélectionner ou le groupe par. P> Il serait préférable d'utiliser la syntaxe de jointure moderne, au lieu de l'ancienne liste de tables séparées par des virgules dans le un équivalent en utilisant mais il serait traduit par la version globale / case sous le capot de toute façon. p> (Tout non testé bien sûr, Comme nous n'avons pas votre schéma de jouer avec ...) p> p> de la clause code>; Et vous devez également fournir le modèle de format dans le
to_char () code> appel de la date: p>
pivot code > serait quelque chose comme: p>
Merci pour votre réponse. Votre première requête a fonctionné !!! Merci! J'ai essayé les jointures mais aucune donnée n'a été retournée.
@JBrown - comme je l'ai dit, non testé ... Mais vous devriez avoir des erreurs plutôt qu'aucun résultat, votre client / application ne les supprime-t-il en quelque sorte? J'avais gardé les jointures dans le même ordre que vous avez énuméré les tables à l'origine, mais deux d'entre eux devaient être échangés sur.
J'utilise SQL Dev. J'ai aussi un autre problème si vous pouvez aider cela serait génial. Je dois totaliser les 5 colonnes dans les instructions de cas et ajouter une colonne "Total". J'ai essayé de quelques façons mais pas de chance. Merci!
Si vous utilisez l'une des deux premières requêtes, vous pouvez simplement ajouter somme (sts.numscore) comme total code>. S'il existe des noms de score de test que vous souhaitez exclure (autre que cinq que vous avez montré), vous pouvez ajouter un filtre ou rendre cette somme conditionnelle. Avec la vraie version de pivot, vous pouvez ajouter les colonnes ensemble - bien que vous puissiez devoir les coopérer avec zéro s'il peut être null. Si vous essayez de vous rendre vraiment bloqué, demandez une nouvelle question.
J'ai ajouté la colonne mais la somme est fausse sur certains enregistrements, mais juste sur les autres? 770 750 (NULL) 3040 720 790 (NULL) 1510
Il semble de doubler les scores sur certains enregistrements? max (cas quand T.Name = 'Reading' Then sts.numscore fin) comme lecture, max (cas lorsque T.Name = 'Math' Alors sts.numscore fin) comme mathématique, max (cas quand T.Name = 'écrire "Alors fin de sts.numscore) en tant qu'écriture, somme (STS.numscore) comme total,
Vous pouvez avoir des enregistrements en double de la partie principale de la requête alors. Si vous modifiez max (case ... code> à
somme (cas ... code> comme test, effectuez les chiffres puis correspondez-vous? Si oui, vous devez déterminer où Les doublons viennent de. (Ou vous n'ayez pas seulement ces cinq noms ...)
Tu as encore raison! Il y avait un autre score de test et après que je excluais, les scores totaux étaient corrects !!! Je vous remercie beaucoup pour votre aide. Passe une bonne journée!
Vous êtes sur la bonne voie et ce que vous essayez d'écrire est une requête de pivot. Voici une version corrigée. Il prend le max em> de chaque case code> expression code> pour éteindre la valeur de la ligne unique que vous souhaitez. En outre, il utilise des jointures explicites appropriées entre toutes les tables. C'est la façon préférée d'écrire une requête SQL moderne. SELECT
sc.name AS School,
s.lastfirst AS Student,
s.student_number,
s.grade_level,
t.name AS Test_Name,
MAX(CASE WHEN ts.name = 'ACT_Reading' THEN sts.numscore end) AS ACT_Reading,
MAX(CASE WHEN ts.name = 'ACT_Math' THEN sts.numscore end) AS ACT_Math,
MAX(CASE WHEN ts.name = 'ACT_English' THEN sts.numscore end) AS ACT_English,
MAX(CASE WHEN ts.name = 'ACT_Science' THEN sts.numscore end) AS ACT_Science,
MAX(CASE WHEN ts.name = 'ACT_Composite' THEN sts.numscore end) AS ACT_Composite,
TO_CHAR(st.test_date),
sts.numscore AS Score
FROM students s
INNER JOIN studenttestscore sts
ON s.id = sts.studentid
INNER JOIN studenttest st
ON sts.studenttestid = st.id
INNER JOIN test score ts
ON sts.testscoreid = ts.id
INNER JOIN test t
ON ts.testid = t.id
INNER JOIN schools sc
ON s.schoolid = sc.school_number
WHERE
t.name = 'ACT' AND
sts.numscore > 0 AND
s.enroll_status = 0 AND
s.schoolid = 10
GROUP BY
sc.name,
s.lastfirst,
s.student_number,
s.grade_level,
t.name,
st.test_date,
sts.numscore
ORDER BY
s.lastfirst,
st.test_date DESC;
Merci pour votre réponse. Je ne pouvais avoir qu'un seul score par rangée.
J'ai peur sans voir vos données, c'est autant d'aide que je peux vous offrir. Si vous souhaitez prendre cela plus loin, puis configurez une démonstration sur un site tel que dbfiddle et peut-être que je peux avoir un look là.
Je l'ai eu avec la première requête de Alex Poole. Je vous remercie beaucoup pour votre aide! Vous avez été correct, je devais ajouter Max et le groupe par des clauses. Passe une bonne journée!