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.