2010-10-23 6 views
3

En essayant de faire pivoter une table sql je suis tombé sur ce poste Here. En utilisant cette méthode, j'ai créé une requête. Cependant, j'ai maintenant réalisé qu'il agrège bien sûr les résultats avec la fonction MAX. Cependant j'ai besoin que le Colum pivote mais que toutes les occurrences soient montrées. Code tiré du message ci-dessus.pivot SQL sans agrégat

SELECT dy, 
     MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1, 
     MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,  
    FROM Classes 
GROUP BY dy 

Donc en substance je souhaite l'utiliser mais sans la fonction max? Des idées?

Modifier les données Exemple

Day Period Subject 

Mon 1   Ch 
Mon 2   Ph 
Tue 1   Ph 
Tue 2   Ele 
Mon 1   Ch 
Mon 2   Ph 
Tue 1   Ph 
Tue 2   Ele 

exemple sortie

Day P1 P2 

Mon Ch Ph 
Mon Ch Ph 
Tue Ph Ele 
Tue Ph Ele 

donc basiquement si les données sont entrées deux fois il apparaît deux fois ...

Modifier sql réelle ..

SELECT other 
     MAX(CASE WHEN period = 1 THEN table2.subj ELSE NULL END) AS P1, 
     MAX(CASE WHEN period = 2 THEN table2.subj ELSE NULL END) AS P2  
    FROM table1 
left join table2 on table2.ID = subject 

GROUP BY other 

Exemple données

Table1

Dy Period Subject other 

Mon 1   1  1 
Mon 2   2  1 
Tue 1   3  2 
Tue 2   4  2 
Mon 1   5  3 
Mon 2   6  3 
Tue 1   7  4 
Tue 2   8  4 

table_2

ID Subj 
1 ch 
2 ph 
3 ph 
4 ele 
5 ch 
6 ph 
7 ph 
8 Ele 

exemple sortie

Day P1 P2 other 

Mon Ch Ph 1 
Mon Ch Ph 3 
Tue Ph Ele 2 
Tue Ph Ele 4 
+1

Fournissez des exemples de données et les résultats attendus afin que nous puissions voir ce que vous essayez d'accomplir. –

Répondre

0

Vos données d'exemple et la sortie désirée ne correspondent pas. Où sont les valeurs Mth, CS2, Lab et Hu provenant de la sortie? Ils ne sont pas dans l'entrée. Ce n'est pas tout à fait clair ce que vous essayez de faire, mais en supposant que les lignes séparées dans votre sortie pour (par exemple) Mon représentant deux étudiants différents, vous devez inclure la colonne distinctive (StudentID) dans votre liste SELECT et la clause GROUP BY. Ensuite, vous pouvez utiliser MAX en toute sécurité pour ne pas agréger (puisqu'il n'y aura qu'une seule valeur par cellule de sortie), mais plutôt pour amener le moteur à faire le pivot pour vous.

Voici le SQL avec l'ID étudiant inclus:

SELECT student_id, dy, 
    MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1, 
    MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,  
FROM Classes 
GROUP BY student_id, dy 

Ceci renverra un enregistrement pour chaque élève pour chaque jour montrant leur horaire de cours par jour. Si vous voulez que la sortie soit triée par jour puis par élève, inversez l'ordre de student_id et dy dans les clauses SELECT et GROUP BY.

+0

désolé votre droit apsolutly que la sortie n'était pas du tout pertinente. Cependant, vous avez supposé raison. et je vous remercie d'avoir souligné le besoin d'inclure le (StudentID) dans l'énoncé de sélection. Cependant, après avoir fait cela pour une raison quelconque, il revient toujours avec un résultat. Toutes les chances de l'exemple de code? Comme je dois faire quelque chose de mal pour que ça ne marche pas. – Tom

+0

J'ai ajouté le SQL à la réponse ci-dessus. –

+0

Est-ce que le fait que plutôt plutôt que les valeurs absolues les rejoignent plutôt que la valeur soit la cause du problème? Comme votre code fonctionne bien jusqu'à ce que j'ajoute les jointures? Merci beaucoup! – Tom

0

Retirer les fonctions MAX et le groupe par

SELECT dy, CASE WHEN période = 1 ALORS SUBJ AUTRE FIN NULL P1, CASE WHEN période = 2 ALORS Obj ELSE END NULL AS P2
des classes

+0

Sans le GROUP BY et l'agrégat, le jeu de résultats n'est pas aplati - vous aurez de nombreuses valeurs NULL à traiter. –

+0

Ma réponse n'est plus correcte, basée sur la question éditée. – automatic

0

Croyez-le ou non, vous ne devez pas retirer le MAX() global fonction pour obtenir tous les résultats. Vous pouvez obtenir les lignes que vous voulez simplement en ajoutant plus de critères à votre clause GROUP BY de telle sorte que vous obtiendrez tous les résultats que vous voulez.

Par exemple, si dy est unique, vous obtenez tous les résultats, mais si vous avez une autre colonne qui rendra unique votre clause GROUP BY, vous pouvez juste l'ajouter, et vous obtiendrez tous les résultats. Supposons que cette colonne s'appelle `id ':

SELECT dy,id, 
     MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1, 
     MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,  
    FROM Classes 
GROUP BY dy, id 
+0

Cela ne fait que restreindre le regroupement - ne traitant pas de la demande de ne pas utiliser MAX. –

+0

Merci pour cela, je pense que ne pas utiliser max mai juste être moi pensant que c'était le problème. Après l'application d'une colonne supplémentaire, je reçois toujours le même résultat qu'une seule ligne de données quand je les veux tous. Des idées? – Tom

+0

OMG Ponies a raison ... vous devez nous donner plus d'informations sur les données que vous interrogez. Voici la chose - il ne suffit pas d'ajouter une autre colonne. Ce doit être une colonne ou un ensemble de colonnes qui rendent la clause GROUP BY unique. Alors, voici un truc ... Quelle est la clé primaire sur la table? Modifiez votre clause GROUP BY afin qu'elle inclue la clé primaire de votre table à la fin et vous obtiendrez toutes les lignes. Je promets. –