Discussion:
Faire apparaître les résultats de requêtes combinées dans l'ordre d'execution
(trop ancien pour répondre)
olive
2013-02-27 19:47:32 UTC
Permalink
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
Alain Montfranc
2013-02-28 05:56:37 UTC
Permalink
Post by 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
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 ?
Ph. B.
2013-02-28 08:02:14 UTC
Permalink
Post by 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
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.
Alain Montfranc
2013-02-28 09:52:38 UTC
Permalink
Post by olive
Post by 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
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.
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
o***@free.fr
2013-02-28 10:47:35 UTC
Permalink
On 28 fév, 10:52, Alain Montfranc <***@aux.spammeurs> wrote:

Bonjour,
Post by Alain Montfranc
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
Patrick V
2013-02-28 11:13:57 UTC
Permalink
Post by o***@free.fr
Post by Alain Montfranc
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
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/
olive
2013-03-01 13:22:13 UTC
Permalink
Post by Patrick V
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
Patrick V
2013-03-04 11:21:02 UTC
Permalink
Post by olive
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/
Ph. B.
2013-02-28 10:53:40 UTC
Permalink
Post by Alain Montfranc
Post by olive
Post by 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
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.
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 ?
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.
o***@free.fr
2013-02-28 10:49:23 UTC
Permalink
On 28 fév, 09:02, "Ph. B." <***@voila.fr>
wrote:

Bonjour,
(...)

ça fonctionne parfaitement, merci beaucoup.

--
Olivier
Loading...