Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[ORACLE][quasi-newbie] Petit probleme lors de la conception d'une requete a base de sous-requetes

1 réponse
Avatar
puimp
Bonjour,

Avant toute chose, je tenais a preciser que je ne suis pas debutant
avec SQl, mais quasiment. Il se peut donc que le probleme que je vous
expose n'en soit pas vraiment un, auquel cas je m'excuse de vous faire
perdre votre temps. De même, j'ignore si c'est bien le bon newsgroup
pour poster, mais je n'en ai pas trouvé d'autre s'approchant plus du
sujet que celui-ci.

En fait, j'ai une petite interrogation avec Oracle. En effet je
dispose d'une table (nommé eventTable) listant des elements par jour,
en indiquant l'id de la personne a l'origine de cet evenement et l'id
de l'evenement en question. J'aimerais pouvoir, par jour et dans un
intervalle de temps fixé, obtenir le nombre d'evenement par personne
(les identifiants etant fixe).
En gros, j'ai une table qui suis la structure suivante

Name Null? Type
--------------- -------- ----
JOUR NOT NULL DATE
ID_OWNER NOT NULL NUMBER
ID_EVENT NOT NULL NUMBER

et j'aimerais avoir une requete dont les le premier champ de chaque
ligne serait le jour, suivi d'un champ par personne, indiquant le
nombre d'evenement dont la personne en question est a l'origine pour
le jour determiné.
Je suis arrivé a un resultat potable en utlisant une sous-requete par
personne. La forme de cette sous requete est:

SELECT
jour,
count(ID_EVENT) as value
FROM
eventTable
where
jour<= -Borne superieure de l'intervalle de temps-
AND jour>=-Borne inferieure de l'intervalle de temps-
AND ID_OWNER = -valeur d'un id-

la requete finale ayant la forme suivante :

SELECT
-nom de la premiere sous-requete-.jour,
-nom de la premiere sous-requete-.value,
-nom de la seconde sous-requete-.value,
<...>
FROM
(
sous-requete
),
(
sous-requete
),
<...>
WHERE
-nom de la premiere sous-requete-.jour = -nom de la seconde
sous-requete-.jour
AND -nom de la seconde sous-requete-.jour = -nom de la troisieme
sous-requete-.jour
<...>
GROUP BY
-nom de la premiere sous-requete-.jour,
-nom de la premiere sous-requete-.value,
-nom de la seconde sous-requete-.value,
<...>

Les resultat sont satisfaisant, du moment que chaque "owner" a été a
l'origine d'au moins un evenement par jour. Si ce n'est pas le cas, et
que donc la ligne correspondant a ce jour n'apparait pas dans les
resultat de la sous-requete, la ligne correspondant a ce jour
n'apparaitra pas dans les resultats finaux, occultant le fait que les
autres "owner" ait pu avoir des evenements pour ce jour, ce qui ne
fait pas mon affaire. J'ignore si je suis sur la bonne voie en me
servant des sous-requetes, ou si je ferais mieux de changer de moyen.
Voila, voila, si quelqu'un avait une solution a me proposer, je
cracherais pas dessus; De même, si je n'est pas été suffisamment
clair, n'hesitez pas a me le faire savoir. Merci d'avance.

1 réponse

Avatar
Igor Racic
Bonjour,

tu peux essayer:


SQL> select * from users;

USERID USERNAME
---------- ----------
1 PERO
2 SIME
3 MATE

SQL> select * from eventtable;

JOUR USERID QTY
---------- ---------- ----------
09/07/2004 1 5
09/07/2004 2 10
10/07/2004 1 1


1 with cp as
2 (
3 select * from (
4 (select distinct jour from eventTable
5 where jour between trunc(sysdate)-2 and trunc( sysdate ) +1 ) ) ,
6 (select userid, username from users )
7 ),
8 ev as
9 ( select jour, userid, count(*) over ( partition by e.jour,
e.userid ) cnt
10 from eventTable e
11 where jour between trunc(sysdate)-2 and trunc( sysdate ) +1
12 )
13 select cp.jour, cp.username, nvl( cnt, 0 )
14 from cp left outer join ev
15 on ( cp.jour = ev.jour and cp.userid = ev.userid )
16* order by cp.jour, cp.username
SQL> /

JOUR USERNAME NVL(CNT,0)
---------- ---------- ----------
09/07/2004 MATE 0
09/07/2004 PERO 1
09/07/2004 SIME 1
10/07/2004 MATE 0
10/07/2004 PERO 1
10/07/2004 SIME 0

6 rows selected.


( Version >= 9i )


Igor