2010-10-06 6 views
1

J'ai une vue qui contient (entre autres colonnes) un en-tête "nom", et une colonne "évaluation" d'article. La vue joint l'en-tête à la table d'éléments, de sorte que la colonne de nom de l'en-tête est répétée pour chaque élément.requête sql pour un rapport

Je dois exécuter un rapport sur la table; idéalement, j'aurais 5 colonnes dans le résultat sql; l'en-tête "nom", et 4 copies de la colonne "notation", où chaque copie de la colonne de notation montre le nombre de notes qui dépassent un certain seuil. Donc, la colonne de notation # 1 montrera le nombre d'articles dans la table (pour l'en-tête de l'article) qui ont une note de 1 ou plus, la deuxième colonne indiquera le nombre d'articles dans le tableau avoir une note de 5 ou plus, et ainsi de suite.

Je sais comment obtenir le nom et 1 colonne Évaluation retour:

select name, count(rating) as cnt1 from myview where rating > 1 group by name 

mais combinant cela avec les autres colonnes de notation souhaitées me manque à l'heure actuelle. J'ai essayé d'utiliser une clause "union", mais cela met simplement plusieurs lignes dans la liste des résultats. Une exigence absolue (la requête doit se brancher sur un modèle de rapport, donc c'est très rigide) est que j'ai seulement une ligne retournée pour chaque champ "nom" unique dans la vue, sinon l'objet de rapport qui va lire le les données ne sauront pas comment interpréter les résultats.

Des conseils?

Mise à jour Voici quelques exemples de données:

name, rating 
myname1, 1 
myname1, 1 
myname1, 10 
myname1, 4 
myname1, 7 
myname1, 3 
myname1, 5 
myname1, 5 
myname1, 4 
myname2, 2 
myname2, 10 
myname2, 6 
myname2, 8 
myname2, 5 
myname2, 4 
myname2, 6 

Et la sortie désirée:

name, cnt1, cnt5, cnt7, cnt8 
myname1, 7, 2, 1, 1 
myname2, 7, 4, 2, 1 

... où CNT1 => Note 1, cnt5 => Note 5, cnt7 = note > 7, cnt8 => note 8

+0

@ user85116, Pouvez-vous poster une mise en page sous forme de tableau de vos données et ce que vous voulez sortir? – Brad

+0

Utilisez une somme (nombre (évaluation))? – Emerion

Répondre

3
select name, 
     sum(case when rating > 1 then 1 else 0 end) as cnt1, 
     sum(case when rating > 5 then 1 else 0 end) as cnt2 
     /* ... repeat as many times as needed */ 
    from myview 
    group by name 
+0

Merci beaucoup! Je n'avais aucune idée que vous pouviez le faire dans la fonction "somme". Apprendre quelque chose de nouveau chaque jour :) – user85116

0

select name, SUM (CASE WHEN> note 1 ALORS 1 AUTRE 0 FIN) comme CNT1, SUM (CASE WHEN> Note 5 ALORS 1 ELSE 0 END) comme cnt5 du groupe myview par nom

Questions connexes