J'essaie d'obtenir un pourcentage de l'élément qui sont disponibles dans une certaine zone.
Utilisation de ma requête, je reçois une erreur Tous les détails: P> J'ai ces deux tables: P> et voulez ce résultat: p> le DDL: p> mon Requête: p> l'erreur: p> ora-00937: non une fonction de groupe mono-groupe code>
Error at Command Line:81 Column:41 (which is the part `(Select Count(ItemId) From allitems inner_allitems Where inner_allitems.areas = outer_allitems.areas )`)
Error report:
SQL Error: ORA-00937: not a single-group group function
7 Réponses :
Voici un premier passage rapide: Aussi, dans vos données de test, votre élémentId 4 doit être modifié en ouest. P> P>
Une légère modification de votre requête d'origine:
Analytics sont votre ami:
SELECT DISTINCT areas ,COUNT(currentitems.itemid) OVER (PARTITION BY areas) * 100 / COUNT(*) OVER () Percentage FROM allitems, currentitems WHERE allitems.itemid = currentitems.itemid(+);
Il mentionne SQL Server et Oracle, peut-être que la requête doit être portable, c'est-à-dire agnostique du fournisseur.
Portabilité Shmortabilité :)
Juste pour le diable, une façon de le faire sans analyse.
La solution de Jeffrey avait besoin d'un distinct en raison de la duplication de zones code>. La table code> allitems code> est en fait une table d'intersection entre
CurrentItems code> et une table
putative code> Tableau. Dans la requête suivante, cela est représenté par la vue Inline Code
AI code>. Il existe une autre vue inine
tot code> qui nous donne le nombre total de nombres d'enregistrements dans
allitems code>. Ce nombre doit être inclus dans la clause du groupe par groupe, car ce n'est pas un projecteur d'agrégation. P>
SQL> select ai.areas
2 , (count(currentitems.itemid)/tot.cnt) * 100 as "%"
3 from
4 ( select count(*) as cnt from allitems ) tot
5 , ( select distinct areas as areas from allitems ) ai
6 , currentitems
7 , allitems
8 where allitems.areas = ai.areas
9 and allitems.itemid = currentitems.itemid(+)
10 group by ai.areas, tot.cnt
11 /
AREAS %
-------------------- ----------
east 50
south 25
west 0
SQL>
Néanmoins, merci pour votre contribution. Je n'ai pas eu le temps aujourd'hui, mais je vais tester toutes les grandes réponses demain!
Utiliser le groupe 'par clause':
Je suppose que même cela aide:
SELECT distinct areas, NVL(x.count_item * 100,0) AS Percentage FROM allitems a LEFT OUTER JOIN ( SELECT ( COUNT(a.itemid) / ( SELECT COUNT(*) FROM allitems ) ) AS count_item, areas AS avl_areas FROM allitems a INNER JOIN currentitems c ON a.itemid = c.itemid GROUP BY areas ) x ON x.avl_areas = a.areas ;
Une solution de contournement que j'ai trouvée au travail (bien que je pense qu'il y a un bug ici) est-ce: dbfiddle p> p>
Merci pour les grandes réponses. Différentes façons de le faire! Merci. J'ai également constaté que, en ajoutant un groupe par (édité la question, regarde dans ma requête pour "***") Cela fonctionne aussi.