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

Faire apparaître les résultats de requêtes combinées dans l'ordre d'execution

9 réponses
Avatar
olive
Bonjour,

Mon problème est un peu particulier, je vais tenter de vous l'exposer. Soit
un logiciel de gestion d'une grosse bibliothèque publique, reposant sur une
base Oracle ; je peux faire toutes les requêtes SQL que je souhaite, via une
console intégrée au logiciel, mais je ne peux pas scripter directement sur
la base.

J'ai écrit (via un petit script en python), une requête qui a la forme
suivante :

select count (*) from table_des_prets where heure_de_pret between YYYY/MM/DD
HH:OO:00 and YYYY/MM/DD HH:59:59 UNION select count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:OO:00 and YYYY/MM/DD HH+1:59:59
(...) UNION count (*) from table_des_prets where heure_de_pret between
YYYY/MM/DD HH+8:OO:00 and YYYY/MM/DD HH+8:59:59.

Le but étant évidemment de connaître le nombre de prêts par heure. Or
lorsque j'execute cette requête, les résultats sont triés par ordre
croissant ou décroissant, ce qui ne m'est d'aucune utilité.

Ce que j'aimerais obtenir : que les résultats apparaissent dans l'ordre où
les requêtes sont exécutées, ou alors un moyen de trier selon l'ordre
croissant des heures de prêt (le champ heure_de_prêt est au format date dans
la base).

Après avoir cherché, je me dis que ce que je demande n'est pas possible,
mais peut-être aurez-vous des idées.

Merci beaucoup.

--
Olivier









--
Olivier

9 réponses

Avatar
Alain Montfranc
olive a émis l'idée suivante :
Bonjour,

Mon problème est un peu particulier, je vais tenter de vous l'exposer. Soit
un logiciel de gestion d'une grosse bibliothèque publique, reposant sur une
base Oracle ; je peux faire toutes les requêtes SQL que je souhaite, via une
console intégrée au logiciel, mais je ne peux pas scripter directement sur
la base.

J'ai écrit (via un petit script en python), une requête qui a la forme
suivante :

select count (*) from table_des_prets where heure_de_pret between YYYY/MM/DD
HH:OO:00 and YYYY/MM/DD HH:59:59 UNION select count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:OO:00 and YYYY/MM/DD HH+1:59:59
(...) UNION count (*) from table_des_prets where heure_de_pret between
YYYY/MM/DD HH+8:OO:00 and YYYY/MM/DD HH+8:59:59.

Le but étant évidemment de connaître le nombre de prêts par heure. Or
lorsque j'execute cette requête, les résultats sont triés par ordre
croissant ou décroissant, ce qui ne m'est d'aucune utilité.

Ce que j'aimerais obtenir : que les résultats apparaissent dans l'ordre où
les requêtes sont exécutées, ou alors un moyen de trier selon l'ordre
croissant des heures de prêt (le champ heure_de_prêt est au format date dans
la base).

Après avoir cherché, je me dis que ce que je demande n'est pas possible,
mais peut-être aurez-vous des idées.

Merci beaucoup.

--
Olivier



Faire un group by sur l'extraction de l'heure depuis le champ time ?
Avatar
Ph. B.
olive a écrit :
Bonjour,

Mon problème est un peu particulier, je vais tenter de vous l'exposer. Soit
un logiciel de gestion d'une grosse bibliothèque publique, reposant sur une
base Oracle ; je peux faire toutes les requêtes SQL que je souhaite, via une
console intégrée au logiciel, mais je ne peux pas scripter directement sur
la base.

J'ai écrit (via un petit script en python), une requête qui a la forme
suivante :

select count (*) from table_des_prets where heure_de_pret between YYYY/MM/DD
HH:OO:00 and YYYY/MM/DD HH:59:59 UNION select count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:OO:00 and YYYY/MM/DD HH+1:59:59
(...) UNION count (*) from table_des_prets where heure_de_pret between
YYYY/MM/DD HH+8:OO:00 and YYYY/MM/DD HH+8:59:59.

Le but étant évidemment de connaître le nombre de prêts par heure. Or
lorsque j'execute cette requête, les résultats sont triés par ordre
croissant ou décroissant, ce qui ne m'est d'aucune utilité.

Ce que j'aimerais obtenir : que les résultats apparaissent dans l'ordre où
les requêtes sont exécutées, ou alors un moyen de trier selon l'ordre
croissant des heures de prêt (le champ heure_de_prêt est au format date dans
la base).

Après avoir cherché, je me dis que ce que je demande n'est pas possible,
mais peut-être aurez-vous des idées.

Merci beaucoup.



Bonjour,
je penserais à la clause order by plutôt que group by.

En introduisant la période, je pense qu'on peut le faire :

select '1' as horaire, count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH:00:00 and YYYY/MM/DD HH:59:59
UNION
select '2' as horaire, count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:00:00 and YYYY/MM/DD HH+1:59:59
(...)
UNION
select '9' as horaire, count (*) from table_des_prets where
heure_de_pret between YYYY/MM/DD HH+8:00:00 and YYYY/MM/DD HH+8:59:59
order by horaire

Bien sur, le 'n' as horaire peut être affiné en introduisant la date et
la période horaire... ;-)
--
Philippe.
Avatar
Alain Montfranc
Dans son message précédent, Ph. B. a écrit :
olive a écrit :
Bonjour,

Mon problème est un peu particulier, je vais tenter de vous l'exposer. Soit
un logiciel de gestion d'une grosse bibliothèque publique, reposant sur une
base Oracle ; je peux faire toutes les requêtes SQL que je souhaite, via
une
console intégrée au logiciel, mais je ne peux pas scripter directement sur
la base.

J'ai écrit (via un petit script en python), une requête qui a la forme
suivante :

select count (*) from table_des_prets where heure_de_pret between
YYYY/MM/DD
HH:OO:00 and YYYY/MM/DD HH:59:59 UNION select count (*) from
table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:OO:00 and YYYY/MM/DD HH+1:59:59
(...) UNION count (*) from table_des_prets where heure_de_pret between
YYYY/MM/DD HH+8:OO:00 and YYYY/MM/DD HH+8:59:59.

Le but étant évidemment de connaître le nombre de prêts par heure. Or
lorsque j'execute cette requête, les résultats sont triés par ordre
croissant ou décroissant, ce qui ne m'est d'aucune utilité.

Ce que j'aimerais obtenir : que les résultats apparaissent dans l'ordre où
les requêtes sont exécutées, ou alors un moyen de trier selon l'ordre
croissant des heures de prêt (le champ heure_de_prêt est au format date
dans
la base).

Après avoir cherché, je me dis que ce que je demande n'est pas possible,
mais peut-être aurez-vous des idées.

Merci beaucoup.



Bonjour,
je penserais à la clause order by plutôt que group by.

En introduisant la période, je pense qu'on peut le faire :

select '1' as horaire, count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH:00:00 and YYYY/MM/DD HH:59:59
UNION
select '2' as horaire, count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:00:00 and YYYY/MM/DD HH+1:59:59
(...)
UNION
select '9' as horaire, count (*) from table_des_prets where heure_de_pret
between YYYY/MM/DD HH+8:00:00 and YYYY/MM/DD HH+8:59:59
order by horaire

Bien sur, le 'n' as horaire peut être affiné en introduisant la date et la
période horaire... ;-)



Quel interet de faire 24 requetes avec union alors que le group by le
fait en une seule ?

J'ai pas Oracle mais avec Postgres ca donne un truc du genre :

select extract(hour from heure_de_pret), count(*)
from table_des_prets
group by 1 order by 1;

Rajouter une where clause si nécessaire pour restreindre à un jour
donné (où à une plage temporaire). Pas besoin d'Union
Avatar
oloc
On 28 fév, 10:52, Alain Montfranc wrote:

Bonjour,

J'ai pas Oracle mais avec Postgres ca donne un truc du genre :

select extract(hour from heure_de_pret), count(*)
from table_des_prets
group by 1 order by 1;



Une telle syntaxe m'interesserait évidemment beaucoup, mais si j'en
crois ceci :
http://www.techonthenet.com/oracle/functions/extract.php

on ne peut pas extraire l'heure d'un champ au format date. De fait, ça
ne marche pas.

Mais je vous remercie de votre réponse.

Olivier
Avatar
oloc
On 28 fév, 09:02, "Ph. B."
wrote:

Bonjour,

En introduisant la période, je pense qu'on peut le faire :



(...)

ça fonctionne parfaitement, merci beaucoup.

--
Olivier
Avatar
Ph. B.
Alain Montfranc a écrit :
Dans son message précédent, Ph. B. a écrit :
olive a écrit :
Bonjour,

Mon problème est un peu particulier, je vais tenter de vous
l'exposer. Soit
un logiciel de gestion d'une grosse bibliothèque publique, reposant
sur une
base Oracle ; je peux faire toutes les requêtes SQL que je souhaite,
via une
console intégrée au logiciel, mais je ne peux pas scripter
directement sur
la base.

J'ai écrit (via un petit script en python), une requête qui a la forme
suivante :

select count (*) from table_des_prets where heure_de_pret between
YYYY/MM/DD
HH:OO:00 and YYYY/MM/DD HH:59:59 UNION select count (*) from
table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:OO:00 and YYYY/MM/DD
HH+1:59:59
(...) UNION count (*) from table_des_prets where heure_de_pret between
YYYY/MM/DD HH+8:OO:00 and YYYY/MM/DD HH+8:59:59.

Le but étant évidemment de connaître le nombre de prêts par heure. Or
lorsque j'execute cette requête, les résultats sont triés par ordre
croissant ou décroissant, ce qui ne m'est d'aucune utilité.

Ce que j'aimerais obtenir : que les résultats apparaissent dans
l'ordre où
les requêtes sont exécutées, ou alors un moyen de trier selon l'ordre
croissant des heures de prêt (le champ heure_de_prêt est au format
date dans
la base).

Après avoir cherché, je me dis que ce que je demande n'est pas possible,
mais peut-être aurez-vous des idées.

Merci beaucoup.



Bonjour,
je penserais à la clause order by plutôt que group by.

En introduisant la période, je pense qu'on peut le faire :

select '1' as horaire, count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH:00:00 and YYYY/MM/DD HH:59:59
UNION
select '2' as horaire, count (*) from table_des_prets
where heure_de_pret between YYYY/MM/DD HH+1:00:00 and YYYY/MM/DD
HH+1:59:59
(...)
UNION
select '9' as horaire, count (*) from table_des_prets where
heure_de_pret between YYYY/MM/DD HH+8:00:00 and YYYY/MM/DD HH+8:59:59
order by horaire

Bien sur, le 'n' as horaire peut être affiné en introduisant la date
et la période horaire... ;-)



Quel interet de faire 24 requetes avec union alors que le group by le
fait en une seule ?

J'ai pas Oracle mais avec Postgres ca donne un truc du genre :

select extract(hour from heure_de_pret), count(*)
from table_des_prets
group by 1 order by 1;

Rajouter une where clause si nécessaire pour restreindre à un jour donné
(où à une plage temporaire). Pas besoin d'Union



Je suis bien d'accord pour l'union, mais sans le order by, on ne répond
pas à la question initiale... :-P
--
Philippe.
Avatar
Patrick V
Le 28/02/2013 11:47, a écrit :
select extract(hour from heure_de_pret), count(*)
from table_des_prets
group by 1 order by 1;



Une telle syntaxe m'interesserait évidemment beaucoup, mais si j'en
crois ceci :
http://www.techonthenet.com/oracle/functions/extract.php

on ne peut pas extraire l'heure d'un champ au format date. De fait, ça
ne marche pas.



Il suffit d'une petite adaptation :

select to_date(trunc(heure_de_pret) ||'
'||to_char(heure_de_pret,'HH24')||':00:00', 'dd/mm/yyyy hh24:mi:ss'),
count(*) from table_des_prets
group by to_date(trunc(heure_de_pret) ||'
'||to_char(heure_de_pret,'HH24')||':00:00', 'dd/mm/yyyy hh24:mi:ss')
order by to_date(trunc(heure_de_pret) ||'
'||to_char(heure_de_pret,'HH24')||':00:00', 'dd/mm/yyyy hh24:mi:ss');


--
http://www.chevaliers4vents.com/
Avatar
olive
Patrick V wrote:

Il suffit d'une petite adaptation :

select to_date(trunc(heure_de_pret) ||'
'||to_char(heure_de_pret,'HH24')||':00:00', 'dd/mm/yyyy hh24:mi:ss'),
count(*) from table_des_prets
group by to_date(trunc(heure_de_pret) ||'
'||to_char(heure_de_pret,'HH24')||':00:00', 'dd/mm/yyyy hh24:mi:ss')
order by to_date(trunc(heure_de_pret) ||'
'||to_char(heure_de_pret,'HH24')||':00:00', 'dd/mm/yyyy hh24:mi:ss');



J'ai essayé ça : pas de message d'erreur, mais la console reste vide, à
l'exception d'un # en haut à gauche. Etrange.

--
Olivier
Avatar
Patrick V
Le 01/03/2013 14:22, olive a écrit :
J'ai essayé ça : pas de message d'erreur, mais la console reste vide, à
l'exception d'un # en haut à gauche. Etrange.



Gni ? Et tu as encore la main ou bien il est en train d'exécuter
péniblement la requête ?

--
http://www.chevaliers4vents.com/