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

pb mise en forme requete

8 réponses
Avatar
J-F Portala
Bonjour,
j'ai une table du type suivant:

id infos ep1 la1 lo1 nb1 ep2 la2 lo2 nb2 ep3 la3 lo3 nb3
ep la lo sont des dimensions (épaisseur largeur longueur) nb est le nombre
d'objets dans ces dimensions



Je souhaiterais afficher pour chaque dimension distincte, le nombre
d'objets sachant que ep1 la1 lo1 peut être identique à ep2 la2 lo2 dans des
enregistrements différents.

Je pensais passer par une table intermédiaire en faisant:

Create temporary table toto (select ep1 as ep,la1 as la,lo1 as lo,nb1 as nb
from table where nb1 > 0) union
(select ep2 as ep,la2 as la,lo2 as lo,nb2 as nb from table where nb2 > 0)
union
(select ep3 as ep,la3 as la,lo3 as lo,nb3 as nb from table where nb3 > 0)

Apres , je pensais faire
select ep,la,lo,sum(nb) from toto where 1 group by ep,la,lo

Le probleme est que la creation de la table ne fonctionne pas.
Il me manque des enregistrements
Les requetes suivantes fonctionnent
Create temporary table toto (select ep1 as ep,la1 as la,lo1 as lo,nb1 as nb
from table where nb1 > 0)
Create temporary table toto (select ep2 as ep,la2 as la,lo2 as lo,nb2 as nb
from table where nb2 > 0)
mais lorsque je fais union, cela ne me donne pas le resultat attendu.

Avez vous des pistes.

Est ce que je suis obligé de passer par une requete intermédiaire (creation
table toto)

Merci de votre aide

Jeff

8 réponses

Avatar
Fred Brouard - SQLpro
votre table viole à l'évidence la première forme normale :
en effet vous avez ep1, ep2, ep3...
Ceci aurait du être mis dans une autre table.

Si vous voulez utiliser des SGBDR il faut un modékle relationnel
normalisé. Sinon, restez-en au tableur...

Le seul moyen de vous en sortir est de renormaliser votre table d'une
manière dynamique (vue par exemple, donc peu performante) ou statique
(restructuration de la table).

CEATE VIEW V_OBJ
AS
SELECT id, infos, ep1 as ep, la1 as la, lo1 as lo, nb1 as nb
FROM matable
UNION ALL
SELECT id, infos, ep2 as ep, la2 as la, lo2 as lo, nb2 as nb
FROM matable
UNION ALL
SELECT id, infos, ep3 as ep, la3 as la, lo3 as lo, nb3 as nb
FROM matable

Dès lors la requête est évidente :

SELECT SUM(nb), ep, la, lo
FROM V_OBJ
GROUP BY ep, la, lo


A +

J-F Portala a écrit :
Bonjour,
j'ai une table du type suivant:

id infos ep1 la1 lo1 nb1 ep2 la2 lo2 nb2 ep3 la3 lo3 nb3
ep la lo sont des dimensions (épaisseur largeur longueur) nb est le nombre
d'objets dans ces dimensions



Je souhaiterais afficher pour chaque dimension distincte, le nombre
d'objets sachant que ep1 la1 lo1 peut être identique à ep2 la2 lo2 dans des
enregistrements différents.

Je pensais passer par une table intermédiaire en faisant:

Create temporary table toto (select ep1 as ep,la1 as la,lo1 as lo,nb1 as nb
from table where nb1 > 0) union
(select ep2 as ep,la2 as la,lo2 as lo,nb2 as nb from table where nb2 > 0)
union
(select ep3 as ep,la3 as la,lo3 as lo,nb3 as nb from table where nb3 > 0)

Apres , je pensais faire
select ep,la,lo,sum(nb) from toto where 1 group by ep,la,lo

Le probleme est que la creation de la table ne fonctionne pas.
Il me manque des enregistrements
Les requetes suivantes fonctionnent
Create temporary table toto (select ep1 as ep,la1 as la,lo1 as lo,nb1 as nb
from table where nb1 > 0)
Create temporary table toto (select ep2 as ep,la2 as la,lo2 as lo,nb2 as nb
from table where nb2 > 0)
mais lorsque je fais union, cela ne me donne pas le resultat attendu.

Avez vous des pistes.

Est ce que je suis obligé de passer par une requete intermédiaire (creation
table toto)

Merci de votre aide

Jeff






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
J-F Portala
Bonjour, et merci de votre reponse.

Effectivement, j'aurais du repasser par une autre table pour ces
informations.
Au départ, j'ai une quinzaine de champs qui décrivent mon enregistrement, et
j'ai du ajouter ces informations
un peu en catastrophe.
J'avais un peu peur des pertes de performances dues à l'ajout d'une table
liée.

J'avais essayé de creer une table temporaire mais j'avais un souci de
syntaxe.

Quelle est la différence entre une vue et une table temporaire.

Jeff
Avatar
Patrick Texier
Le Fri, 15 Jun 2007 09:57:16 +0200, Fred Brouard - SQLpro a écrit :

Si vous voulez utiliser des SGBDR il faut un modéle relationnel
normalisé. Sinon, restez-en au tableur...



Toujours aussi pédant.
Avatar
nobody
mais ou a t il appris ce qu'il ignore pour donner une pareille réponse

1FN - première forme normale : toute propriété dépend de la clé
Une entité est en première forme normale si toutes ses propriétés sont
élémentaires et s’il existe au moins une clé caractérisant chaque
occurrence de l’entité. Toute propriété doit avoir un sens pour toute
occurrence de la relation ou de l’entité (il doit y avoir dépendance
fonctionnelle vis à vis de la clé). Cette normalisation peut amener à
créer des sous-types spécialisés pour les propriétés non
systématiquement pertinentes, pour les propriétés répétitives ou
multi-valuées.

sa table ne viole pas cette règle sa table a simplement des champs
multivalué ce qui n'est en rien une violation de la règle mais un cas
particulier prévue par la règle et vue des débats que vous avez eux vous
ne savez pas gérer ce type d'exemption (demandez à helios (il y a
longtemps que je ne lis plus ici))




Fred Brouard - SQLpro a écrit :
votre table viole à l'évidence la première forme normale :
en effet vous avez ep1, ep2, ep3...
Ceci aurait du être mis dans une autre table.

Si vous voulez utiliser des SGBDR il faut un modékle relationnel
normalisé. Sinon, restez-en au tableur...

Le seul moyen de vous en sortir est de renormaliser votre table d'une
manière dynamique (vue par exemple, donc peu performante) ou statique
(restructuration de la table).

CEATE VIEW V_OBJ
AS
SELECT id, infos, ep1 as ep, la1 as la, lo1 as lo, nb1 as nb
FROM matable
UNION ALL
SELECT id, infos, ep2 as ep, la2 as la, lo2 as lo, nb2 as nb
FROM matable
UNION ALL
SELECT id, infos, ep3 as ep, la3 as la, lo3 as lo, nb3 as nb
FROM matable

Dès lors la requête est évidente :

SELECT SUM(nb), ep, la, lo
FROM V_OBJ
GROUP BY ep, la, lo


A +

J-F Portala a écrit :
Bonjour,
j'ai une table du type suivant:

id infos ep1 la1 lo1 nb1 ep2 la2 lo2 nb2 ep3 la3 lo3 nb3
ep la lo sont des dimensions (épaisseur largeur longueur) nb est le
nombre d'objets dans ces dimensions



Je souhaiterais afficher pour chaque dimension distincte, le nombre
d'objets sachant que ep1 la1 lo1 peut être identique à ep2 la2 lo2
dans des enregistrements différents.

Je pensais passer par une table intermédiaire en faisant:

Create temporary table toto (select ep1 as ep,la1 as la,lo1 as lo,nb1
as nb from table where nb1 > 0) union
(select ep2 as ep,la2 as la,lo2 as lo,nb2 as nb from table where nb2 >
0) union
(select ep3 as ep,la3 as la,lo3 as lo,nb3 as nb from table where nb3 > 0)

Apres , je pensais faire
select ep,la,lo,sum(nb) from toto where 1 group by ep,la,lo

Le probleme est que la creation de la table ne fonctionne pas.
Il me manque des enregistrements
Les requetes suivantes fonctionnent
Create temporary table toto (select ep1 as ep,la1 as la,lo1 as lo,nb1
as nb from table where nb1 > 0)
Create temporary table toto (select ep2 as ep,la2 as la,lo2 as lo,nb2
as nb from table where nb2 > 0)
mais lorsque je fais union, cela ne me donne pas le resultat attendu.

Avez vous des pistes.

Est ce que je suis obligé de passer par une requete intermédiaire
(creation table toto)

Merci de votre aide

Jeff






Avatar
nobody
Patrick Texier a écrit :
Le Fri, 15 Jun 2007 09:57:16 +0200, Fred Brouard - SQLpro a écrit :

Si vous voulez utiliser des SGBDR il faut un modéle relationnel
normalisé. Sinon, restez-en au tableur...



Toujours aussi pédant.




avis partagé et nous sommes pas les seuls à avoir cet avis sur Fred
Avatar
Olivier Miakinen
Le 15/06/2007 20:00, nobody a écrit :

[...] (demandez à helios (il y a longtemps que je ne lis plus ici))



Ce n'est pas la peine de le faire revenir, hein !

Fred Brouard - SQLpro a écrit :
[ plusieurs dizaines de lignes citées ]





Oui, la porcinographie, helios savait faire aussi. :(
Avatar
nobody
Olivier Miakinen a écrit :
Le 15/06/2007 20:00, nobody a écrit :
[...] (demandez à helios (il y a longtemps que je ne lis plus ici))



Ce n'est pas la peine de le faire revenir, hein !




ce serait peut être intéressant juste le temps de dégonfler les
chevilles de certain; d'ailleurs qu'est il devenue il parlait de gros
contrat avant sont départ.
Avatar
Jogo
Sur fr.comp.applications.sgbd, J-F Portala disait :

Quelle est la différence entre une vue et une table temporaire.



Normalement, une table temporaire est calculée lors de sa création,
alors qu'une vue n'est calculée que lors d'une requête. Une autre façon
de comprendre la différence, c'est que si des données sont ajoutées
dans les tables d'origines après la création (de la table temporaire ou
de la vue), ces données seront prises en compte dans la vue mais pas
dans la table temporaire.

--
La danse Morris est commune à tous les mondes habités du multivers.
-- T. Pratchett