[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 386
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 386
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 386
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 190
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 386
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 386
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 386
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 190
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 386
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 386
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 386
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