[SQL] comment calculer un total ?

Résolu/Fermé
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
- 23 nov. 2005 à 14:41
gggnhg
Messages postés
1
Date d'inscription
samedi 28 mars 2015
Statut
Membre
Dernière intervention
28 mars 2015
- 28 mars 2015 à 03:39
Bonjour à tous,

voilà jusqu'ici j'utilisais la requête suivante en SQL :

SELECT ProductName, SUM(Quantity) AS TOTAL
FROM DeliveryDtls
WHERE (DATEDIFF(dd, CreateDate, '11/02/2005') = 0) AND (Quality LIKE 'S')
GROUP BY ProductName


ProductName étant une colonne ainsi que Qality. Dans la table Quality j'ai 5 option dont 'S'.

Cette requête me permet d'avoir le total de mes produits de la table pour la journée. Chaque ligne représentant un produit.

Moi je voulais savoir s'il était possible d'avoir une seule ligne au lieu de plusieurs et donc un total.

Pour exemple :

le jour cité ma requête donne comme résultat :

ProductName I TOTAL
produit1 : 5
produit2 : 15
produit3 : 20
produit4 : 100
produit5 : 5
...

moi je voudrais que le résultat de ma requête soit :
Totalproduits : 145 par exemple

J'ai un bouquin mais dedans ils expliquent comment faire une moyenne mais pas comment faire un total d'une table...

si quelqu'un a la réponse je l'en remercie d'avance...

30 réponses

GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
23 nov. 2005 à 15:09
Et si tu enleve le "productName" ?
SELECT SUM(Quantity) AS TOTAL
FROM DeliveryDtls
WHERE (DATEDIFF(dd, CreateDate, '11/02/2005') = 0) AND (Quality LIKE 'S')
10
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
23 nov. 2005 à 14:45
Et si tu enleve le "group by" ?
2
hssissen
Messages postés
844
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
9 janvier 2017
50
23 nov. 2005 à 15:05
Exact! si tu veux une somme totale, tu ne peux pas faire une somme par groupe, donc sans group by!
0
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
23 nov. 2005 à 15:05
Si j'enlève Group By ma requête ne fonctionne pas et si je mets à la place order by c'est pareil...
2
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
25 nov. 2005 à 16:56
Y'a pas de probleme, si j'amais tu as un autre probleme, n'hesite pas. ;-)
2
Bonjour voilà j'ai ce problème avec PL/SQL.
Je n'ai pu résoudre que les questions 1 et 2. Merci
TP de Oracle (SQL*Plus – PL /SQL)

NB : Vous devez peupler la base avec des données afin de tester les différents codes écrits.

Le but final est de vous amener à résoudre un problème posé globalement, dont l’analyse serait, dans la vie réelle, soumise à votre entière responsabilité. La nécessité d’évaluer votre capacité à aborder un tel problème conduit à le décomposer artificiellement en sous questions. Celles-ci sont posées dans un ordre logique et cohérent. Ne pas répondre à une question, ou y répondre dans un ordre quelconque, peut vous conduire à donner, pour une sous question suivante, une réponse hors sujet ou inadapté.
Question 1 :

Une agence de voyages traite avec une chaîne d’hôtels des réservations de chambres en vue d’un séjour.
Dans un premier temps les clients émettent des demandes qui seront par la suite satisfaites dans la mesure des disponibilités.
Ces demandes peuvent concerner un hôtel précis, ou bien un hôtel d’un certain nombre d’étoiles dans une région donnée.
Les chambres sont répertoriées par catégories. Il peut y avoir des chambres de catégories différentes dans un même hôtel, mais un hôtel ne dispose pas forcément de chambre dans chaque catégorie.
Une période de réservation est définie par des dates de début et de fin (respectivement d et f), définies par des chaînes de longueur fixe et de format: (jour/mois/année).
Toute réservation i déjà faite est repérée elle aussi par ses dates de début et de fin (respectivement di et fi).
Lorsqu’on désire réserver une chambre donnée dans un hôtel donné, il faut donc commencer par vérifier que la chambre est bien libre. Ceci est vrai si on a : f < di ou d > fi, quelque soit i.
Voici le script SQL de création de sa base de données :

Create table hotels
(
numh integer,
nomh varchar(30),
etoiles number,
adresse varchar(40),
code_postal char(5),
ville varchar(30),
Constraint pk_hotel primary key (numh)
);

Create table clients
(
numcli integer,
nomcli varchar(30),
adrcli varchar(50),
codepostcli char(5),
villecli varchar(30),
telcli char(15),
Contraint pk_cli primary key (numcli)
);

Create table categories
(
numcat integer,
nbplace integer,
nblits integer,
sdb char(1),
prix float,
Constraint pk_cat primary key (numcat)
);

Create table chambres
(
numch integer,
numh integer,
exposition varchar(20),
priseTV char(1),
telephone char(15),
categorie number,
Constraint pk_ch primary key (numh, numch),
Constraint fk_chcat foreign key (categorie) references categories (numcat) on delete set null on update cascade
) ;



Create table reservations
(
numres integer,
datereserv char(8),
debut char(8),
fin char(8),
nbpers integer,
client integer,
hotel integer,
chambre integer,
Constraint pkres primary key (numres),
Constraint fk_rescli foreign key (client) references clients (numcli) on delete set null on update cascade,
Constraint fk_reshot foreign key (hotel) references chambres (numh) on delete set null on update cascade,
Constraint fk_resch foreign key (chambre) references chambres (numch) on delete set null on update cascade
) ;



Create table demandes
(
numdem integer,
datedemande char(8),
debut char(8),
fin char(8),
nbpers integer,
region varchar(20),
refus char(1),
client integer,
categorie integer,
hotel number,
Constraint pk_dem primary key (numdem),
Constraint fk_demcli foreign key (client) references clients (numcli) on delete set null on update cascade,
Constraint fk_demcat foreign key (categorie) references categories (numcat) on delete set null on update cascade,
Constraint fk_demhot foreign key (hotel) references hotels (numh) on delete set null on update cascade
);








1- Le seul moyen de comparer des dates, représentées par des chaînes dont les poids forts correspondent au numéro de jour, est de les transformer en “dates juliennes”.
Ecrivez, en PL/SQL, la fonction function julienne (d char) return number qui prend la date d, exprimée sous la forme d’une chaîne fixe avec le format SQL ’DD/MM/YYYY’, et la transforme, en utilisant le format de date ’J’, en date julienne (nombre de jours écoulés depuis une date de référence).

2- Afin de savoir si une chambre de numéro donné est libre ou non au cours d’une période donnée, il faut aller rechercher toutes ses dates de début et de fin de réservation, et les comparer avec les bornes de la période.
Ceci nécessite l’exploitation d’un curseur. Ce n’est que lorsqu’on a balayé tous les tuples retournés par ce dernier que l’on peut affirmer que la chambre est bien libre.
Par contre, dès qu’une seule réservation présente dans la table interfère avec la demande, on est certain que la chambre n’est pas libre.
Ecrivez la fonction function est_libre(nh number, nch number, d number, f number) return Boolean Qui retourne VRAI si la chambre numéro nch de l’hôtel nh est libre entre les dates d et f, exprimées en date julienne, et FAUX dans le cas contraire.

3- Donnez le texte PL/SQL de déclaration du curseur qui permet d’obtenir la liste des chambres d’un hôtel donné, défini par sa clé nh, pour une catégorie de chambre précisée par la valeur catch.

4- Donnez la déclaration PL/SQL de la variable destinée à servir de buffer de réception pour les données retournées par ce curseur.

5- Ecrivez la fonction PL/SQL : funtion cherche_libre(nh number, catch number, d char, f char) return integer qui retourne le numéro de la première chambre trouvée d’une catégorie donnée, dans un hôtel donné, libre pour la période comprise entre d et f.
Cette recherche ne pourra se faire que dans la mesure où la recherche d’une chambre de la catégorie demandée a pu aboutir.
Si aucune chambre n’est trouvée, la valeur zéro sera retournée.
N.B : Cette fonction utilise naturellement les fonctions écrites précédemment.

6- Ecrivez la procédure PL/SQL : procedure reserver(ncli number, nom_hotel varchar, la_ville varchar, catch number, nbp number, deb_res char, fin_res char, out OK boolean) qui effectue pour le client de clé ncli, et pour nbp personnes, la réservation d’une chambre de catégorie catch dans l’hôtel de nom nom_hotel de la ville de la_ville, pour la période définie par deb_res et fin_res.
Si l’hôtel n’existe pas, l’exception HOTEL_INCONNU sera levée.
Si la réservation est impossible, le paramètre en mode de sortie OK sera positionné à FAUX. La date de réservation sera naturellement la date du jour (SYSDATE en ORACLE).
On supposera l’existence d’une séquence nommée seq_reserv pour attribuer un nouveau numéro de réservation.
0
bonjour
vous avez la correction de cette exercice?
merci
0
gggnhg
Messages postés
1
Date d'inscription
samedi 28 mars 2015
Statut
Membre
Dernière intervention
28 mars 2015
> bobe
28 mars 2015 à 03:39
bonjour
Est ce que vous avez la correction de cet exercice?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
23 nov. 2005 à 15:13
Very Good Gally !!! effectivement ça me donne le total de la journée...

merci !!!

je voulais savoir dans la foulée si quelqu'un sait si on peut faire sur une période.. mon code est actuellement faire sur la journée. Est-il possible de le faire sur une semaine ?

1
hssissen
Messages postés
844
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
9 janvier 2017
50
23 nov. 2005 à 15:47
Oui, tu n'as qu'a introduire dans ta SELECT, WHERE et BETWEEN le semaine convertie en nb. de jours (7!).
0
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
23 nov. 2005 à 16:48
Je dois avouer que ce n'est pas très clair pour moi ce que tu dis...
1
bacchuss
Messages postés
1162
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
6 avril 2009
191
23 nov. 2005 à 16:53
Syntaxe:

SELECT champ 
FROM matable 
WHERE condition BETWEEN  '2005-01-01' AND '2005-12-31'


tout depend de ton format de date dans ta base aussi
1
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
23 nov. 2005 à 17:10
Je crois que j'ai toujours pas saisi la requête que vous m'expliquez...
j'ai essayé ça :
SELECT SUM(Quantity) AS TOTAL
FROM DeliveryDtls
WHERE (Quality like 'S') BETWEEN '11/02/2005' AND '11/07/2005'

à priori c'est pas ça

le probleme c'est que ma date est du genre 28/07/2005 18:44:
et quand je fais une requête je dois mettre la date à l'envers, ça fonctionne pas si je mets '07/28/2005%'
1
SELECT SUM(Quantity) AS TotalQuantity
FROM DeliveryDtls
WHERE ......

risquer d'utiliser TOTAL comme nom du champ du total.....
0
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
23 nov. 2005 à 17:14
Comment tu enregistre ta date dans ta base ?
Avec un champ date, datetime, timestamp ou un simple varchar ?
1
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
23 nov. 2005 à 17:23
Petite question:
comment ca ce fait que ca marche ca :
DATEDIFF(dd, CreateDate, '11/02/2005') 

parce que datediff ne prend que 2 parametre, et '11/02/2005' n'estpas comprit pas mysql. Et a quoi correspond CreateDate ?
1
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
23 nov. 2005 à 17:30
Bon, je part, si demande tu as pas ta réponse, je continurai a chercher. ;-)
1
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
25 nov. 2005 à 16:45
Je vous remercie pour votre aide et pour les solutions apportées à mon problème...
;)
1
bacchuss
Messages postés
1162
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
6 avril 2009
191
23 nov. 2005 à 17:13
SELECT SUM(Quantity) AS TOTAL
FROM DeliveryDtls
WHERE Quality like 'S' AND (ta_date_a_toi BETWEEN '11/02/2005' AND '11/07/2005') 


c'est dd le nom de ta date ?

comme je l'ai dit aussi:
tout depend de ton format de date dans ta base aussi

regarde un peu du coté des timestamp pour tes problemes de format de date
0
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
23 nov. 2005 à 17:20
c'est du datetime GallyNet
0
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
23 nov. 2005 à 17:48
DateCreate correspond à la date de création de la ligne. On utilise un logiciel externe dans lequel on entre des données et chaque données est entrée dans la base de données SQL. Chaque produit que l'on entre dans ce logiciel correspond à une ligne dans la bdd.
C'est un peu fouilli mes explications.

datediff je l'écris comme ça dans ma requête :
WHERE (DATEDIFF(dd, CreateDate, '11/02/2005') = 0)

il faut que je signale que j'utilise une version anglaise de windows
0
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
24 nov. 2005 à 08:53
Justement je comprend comment tu utilise le datediff parce qu'il ne doit prend en compte que les deux premier parametre, autrement dit ca doit etre la même chose que :
WHERE (DATEDIFF(dd, CreateDate) = 0) 
0
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
24 nov. 2005 à 09:15
non je ne crois pas que ce soit la même chose... moi pour le datediff il me demande 3 arguments.
j'ai le message suivant si je mets la requete que m'as dit :

SELECT ProductName, SUM(Quantity) AS TOTAL
FROM DeliveryDtls
WHERE (DATEDIFF(dd, CreateDate) = 0) AND (Quality LIKE 'S')
GROUP BY ProductName


[Microsoft][ODBC SQL Server Driver][SQL Server]The datediff function requires 3 arguments.

0
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
24 nov. 2005 à 09:31
Ok, mais alors a quoi correspond le 'dd' ?
0
Riwalenn
Messages postés
364
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
16 février 2015
101
24 nov. 2005 à 09:45
J'en ai aucune idée, on m'avait filé le code sur ce forum pour pouvoir avoir une requête sur une journée donnée vu que le % ne fonctionne pas chez moi...
et le dd n'est pas expliqué sur mon bouquin, il n'existe même pas :P
0
GallyNet
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
385
25 nov. 2005 à 16:47
Ola, d'ailleur j'était tellement pris par mon travail que j'ai pas reposté depuis un moment.
Ta trouver une solution ou ta toujours un probleme ?
0
bonjour,

dans datediff ou aussi dateadd, le format est le suivant :

datediff('d', date1, date2) avec d pour une difference en jours, m pour une difference en mois, etc... en fait ce parametre permet de déterminé l'unité de mesure de la différence : seconde, minute, heure, jour, semaine, mois, annee.

et voila...
0