Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/06/2011, 15h35   #1
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Par défaut Le langage Sql pourait il répondre a mes besoins ?!

Salut tout le monde

j'ai fait une requête qui permet de calculer le nombre un nombre d'incident et de travaux et de Accident a partir de 3 tables, je vous montre ma requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
SELECT tt.nom_dd,
       SUM(tt.cn)AS nombreinc,
       SUM(tt.c) AS nombreacci,
       SUM(tt.r) AS nombretravaux
FROM   ((SELECT p.nom_dd,
                COUNT(*) AS cn,
                0        AS c,
                0        AS r
         FROM   incident i
                JOIN dp p
                  ON ( p.nom_dp = i.nom_dp )
         WHERE  CONVERT (VARCHAR(10), i.date_cou, 103) = '01/01/2010'
         GROUP  BY p.nom_dd,
                   i.date_cou)
        UNION
        (SELECT p.nom_dd,
                0,
                COUNT(*),
                0
         FROM   accident a
                JOIN dp p
                  ON p.nom_dp = a.nom_dp
         WHERE  CONVERT (VARCHAR(10), a.date_acc, 103) = '26/05/2011'
         GROUP  BY p.nom_dd,
                   a.date_acc)
        UNION
        (SELECT nom_dd,
                0,
                0,
                COUNT(*)
         FROM   travaux
         WHERE  CONVERT (VARCHAR(10), datecou_tra, 103) = '27/05/2011'
         GROUP  BY nom_dd,
                   datecou_tra))AS tt
GROUP  BY tt.nom_dd
Cette requête fonctionne correctement, mais je veux rajouter certain chose, mais je sais pas si c'est possible de le faire avec sql !


Ce que je veux rajouter :

- j'ai une table DD où il y a toutes les DD existantes (Nom_dd), dans ma requête je suis en train d'extraire uniquement les DD touchées par des incidents ou accidents ou travaux au jour J, Est-ce que je peux demander à ma requête de m'afficher toutes les Nom_dd de la table DD, et si cette DD au jour J n'a été touché ni par incident ni par Accident ou Travaux Alors elle aura la valeur 0. C'est a dire au jour J cette DD a eu 0 Incident, 0 Travaux et 0 Accident ?!

- Rajouter aussi à la fin du tableau qui sera affiché c'est a dire après avoir affiché toutes les Nom_dd juste après mettre Total, et dans les colonnes 'NombreInc', 'NombreAccident' et 'NombreTravaux' j'affiche la somme de chaque colonne ?!


je vous montre mes 4 tables concerné :

Table DD :

Code :
1
2
3
4
5
6
7
8
9
 
CREATE TABLE [dbo].[DD]
  (
     [Nom_dd] [VARCHAR] (100) COLLATE french_ci_as NOT NULL,
     [Lt]     [FLOAT] NULL,
     [Nd]     [INT] NULL,
     [Ev]     [FLOAT] NULL
  )
ON [PRIMARY]
Table DP :

Code :
1
2
3
4
5
6
7
CREATE TABLE [dbo].[DP]
  (
     [Nom_dp] [VARCHAR] (100) COLLATE french_ci_as NOT NULL,
     [Stg]    [VARCHAR] (50) COLLATE french_ci_as NULL,
     [Nom_dd] [VARCHAR] (100) COLLATE french_ci_as NULL
  )
ON [PRIMARY]
Table Incident :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
CREATE TABLE [dbo].[Incident]
  (
     [Date_cou]    [DATETIME] NOT NULL,
     [N_seq]       [INT] NOT NULL,
     [DateInc]     [DATETIME] NULL,
     [Tci]         [VARCHAR] (50) COLLATE french_ci_as NULL,
     [Nc]          [INT] NULL,
     [Date_remise] [DATETIME] NULL,
     [Nom_dp]      [VARCHAR] (100) COLLATE french_ci_as NULL,
     [Nom_cause]   [VARCHAR] (100) COLLATE french_ci_as NULL,
     [Nom_siege]   [VARCHAR] (100) COLLATE french_ci_as NULL
  )
ON [PRIMARY]
Table Travaux :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE TABLE [dbo].[Travaux]
  (
     [DateCou_tra]   [DATETIME] NOT NULL,
     [id_tra]        [INT] NOT NULL,
     [Type_tra]      [VARCHAR] (50) COLLATE french_ci_as NULL,
     [Nc_tra]        [INT] NULL,
     [Tci_tra]       [VARCHAR] (50) COLLATE french_ci_as NULL,
     [DateRemis_tra] [DATETIME] NULL,
     [Nom_dd]        [VARCHAR] (100) COLLATE french_ci_as NULL
  )
ON [PRIMARY]
Je sais pas comment faire, et je sais même si c'est possible de le faire avec sql ou bien il faut que j'introduis un langage de programmation ?!

Merci pour votre attention


--------------------------------------
je travaille avec SqlServer2000
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 15h48   #2
Membre habitué
 
Avatar de tfc3146
 
Homme Robert Labrousse
Développeur décisionnel
Inscription : février 2009
Messages : 79
Détails du profil
Informations personnelles :
Nom : Homme Robert Labrousse
Localisation : France

Informations professionnelles :
Activité : Développeur décisionnel
Secteur : Boutique - Magasin

Informations forums :
Inscription : février 2009
Messages : 79
Points : 134
Points : 134
Bonjour,
Je n’ai as très bien compris le 1er point de ta question. Pour ce qui est du total Incidents, tout dépend du nombre de fois que tu exécutes ta requête et la taille de ta table.
Si tu n’exécutes pas souvent ta requête et que tu as peu de lignes dans ta table, je te conseillerais de passer par une vue.
Sinon, tu devrais rajouter ces attributs lors de la création de ta table et faire un trigger qui te permettrait de ne pas faire une agrégation à chaque exécution de ta requête.

J’espère t’avoir éclairé sur la moitié de ta question
tfc3146 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 16h11   #3
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Merci tfc3146 pour votre réponse

Citation:
Pour ce qui est du total Incidents, tout dépend du nombre de fois que tu exécutes ta requête et la taille de ta table.
- Ma requête sera exécuté quotidiennement, c'est a dire chaque jour en fin de journée, l'utilisateur pourra vérifier combien a eu d'incident ou bien accident...

- Pour la taille de ma table si je réussi a faire le premier point qui a été indiqué dans l'autre message, la je peux dire que ma table aura une taille fixe disant 13 ligne et Totale sera la 14 eme ligne.

Citation:
Si tu n’exécutes pas souvent ta requête et que tu as peu de lignes dans ta table, je te conseillerais de passer par une vue.
Sinon, tu devrais rajouter ces attributs lors de la création de ta table et faire un trigger qui te permettrait de ne pas faire une agrégation à chaque exécution de ta requête.
je connais même pas qu'est-ce que c'est un Trigger donc je sais pas si sa va m'aider comme vous m'avez proposé ou pas.

Citation:
Je n’ai pas très bien compris le 1er point de ta question
- la requête que j'ai posté permet d'afficher uniquement les DD touché soit par un incident soit Accident ou travaux, Moi je veux afficher toutes les DD existante dans ma table DD même si l'une de ces DD ni touché ni par Accident, Incident ou travaux Alors cette DD aura la valeur 0 pour Nombre Incident, 0 pour Travaux et 0 pour Accident.


Merci
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 16h55   #4
Membre habitué
 
Avatar de tfc3146
 
Homme Robert Labrousse
Développeur décisionnel
Inscription : février 2009
Messages : 79
Détails du profil
Informations personnelles :
Nom : Homme Robert Labrousse
Localisation : France

Informations professionnelles :
Activité : Développeur décisionnel
Secteur : Boutique - Magasin

Informations forums :
Inscription : février 2009
Messages : 79
Points : 134
Points : 134
Oublie le trigger vu que tu manipules des « micros-tables » tes temps de réponses doivent être très rapides.
Voilà ce que moi je ferai :je rajouterai à la table des DD, des attrbuts Somme_Inc, Somme_Acc, et Somme_Trav que j’initialiserai à zéro et que j’alimenterai par une procédure PL/SQL lancée tous les jours.
tfc3146 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 18h18   #5
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Merci tfc3146.

Citation:
je rajouterai à la table des DD, des attrbuts Somme_Inc, Somme_Acc, et Somme_Trav que j’initialiserai à zéro et que j’alimenterai par une procédure PL/SQL lancée tous les jours.
Cette solution ne répond pas a mes besoins, moi je veux pas garder les sommes dans ma BBD, la somme c'est juste pour l'afficher aux utilisateurs.

Y a t'il pas d'autre solution plus optimale ?!

Merci
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 08h10   #6
Modérateur
 
Avatar de Chtulus
 
Homme Cédric
Cherche à comprendre
Inscription : avril 2008
Messages : 2 262
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Cherche à comprendre

Informations forums :
Inscription : avril 2008
Messages : 2 262
Points : 4 421
Points : 4 421
Envoyer un message via MSN à Chtulus Envoyer un message via Skype™ à Chtulus
Bonjour,

Et la table accident on l'invente

Avec un petit jeu de données en plus, ce serait parfait !

__________________
- De quelque manière qu'on s'y prenne on s'y prend toujours mal -
-Sigmund Freud-

Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
Tous les cours Office

Chtulus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 13h28   #7
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Aah oui Chtulus je suis désolé, j'ai pas remarqué

La voila :
Code :
1
2
3
4
5
6
7
8
9
 
CREATE TABLE [dbo].[Accident] (
	[id_acc] [int] NOT NULL ,
	[Type_acc] [char] (10) COLLATE French_CI_AS NULL ,
	[Nbr_décée] [int] NULL ,
	[Nbr_bles] [int] NULL ,
	[Date_acc] [datetime] NOT NULL ,
	[Nom_dp] [varchar] (100) COLLATE French_CI_AS NULL 
) ON [PRIMARY]
Merci
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 14h38   #8
Modérateur
 
Avatar de Chtulus
 
Homme Cédric
Cherche à comprendre
Inscription : avril 2008
Messages : 2 262
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Cherche à comprendre

Informations forums :
Inscription : avril 2008
Messages : 2 262
Points : 4 421
Points : 4 421
Envoyer un message via MSN à Chtulus Envoyer un message via Skype™ à Chtulus
Hum, bonjour info3licen,

Tu aurais un petit jeu de données stp ? (J'ai la flemme avec ce WE)

__________________
- De quelque manière qu'on s'y prenne on s'y prend toujours mal -
-Sigmund Freud-

Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
Tous les cours Office

Chtulus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 16h26   #9
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Re

Citation:
Tu aurais un petit jeu de données stp ? (J'ai la flemme avec ce WE)
Excusez moi, mais je connais pas qu'est-ce que c'est un jeu de données !

Sorry
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/06/2011, 16h40   #10
Modérateur
 
Avatar de Chtulus
 
Homme Cédric
Cherche à comprendre
Inscription : avril 2008
Messages : 2 262
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Cherche à comprendre

Informations forums :
Inscription : avril 2008
Messages : 2 262
Points : 4 421
Points : 4 421
Envoyer un message via MSN à Chtulus Envoyer un message via Skype™ à Chtulus
Bonjour,

De quoi remplir les tables

__________________
- De quelque manière qu'on s'y prenne on s'y prend toujours mal -
-Sigmund Freud-

Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
Tous les cours Office

Chtulus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 10h36   #11
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Si j'ai bien compris le premier point, vous pouvez faire une jointure externe sur la table DD :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
 
SELECT 
       COALESCE(DD.nom_dd, 'TOTAL') AS nom_dd
       SUM(COALESCE(tt.cn, 0))AS nombreinc,
       SUM(COALESCE(tt.c, 0)) AS nombreacci,
       SUM(COALESCE(tt.r, 0)) AS nombretravaux
FROM DD 
LEFT OUTER JOIN  ((SELECT p.nom_dd,
                COUNT(*) AS cn,
                0        AS c,
                0        AS r
         FROM   incident i
                JOIN dp p
                  ON ( p.nom_dp = i.nom_dp )
         WHERE  CONVERT (VARCHAR(10), i.date_cou, 103) = '01/01/2010'
         GROUP  BY p.nom_dd,
                   i.date_cou)
        UNION
        (SELECT p.nom_dd,
                0,
                COUNT(*),
                0
         FROM   accident a
                JOIN dp p
                  ON p.nom_dp = a.nom_dp
         WHERE  CONVERT (VARCHAR(10), a.date_acc, 103) = '26/05/2011'
         GROUP  BY p.nom_dd,
                   a.date_acc)
        UNION
        (SELECT nom_dd,
                0,
                0,
                COUNT(*)
         FROM   travaux
         WHERE  CONVERT (VARCHAR(10), datecou_tra, 103) = '27/05/2011'
         GROUP  BY nom_dd,
                   datecou_tra))AS tt
    ON tt.nom_DD = DD.nom_DD
GROUP  BY tt.nom_dd

Pour le total, vous pouvez utiliser ROLLUP pour votre GROUP BY, quelque chose comme : (à adapter à votre besoin précis)

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
 
SELECT DD.nom_dd,
       SUM(COALESCE(tt.cn, 0))AS nombreinc,
       SUM(COALESCE(tt.c, 0)) AS nombreacci,
       SUM(COALESCE(tt.r, 0)) AS nombretravaux
FROM DD 
LEFT OUTER JOIN  ((SELECT p.nom_dd,
                COUNT(*) AS cn,
                0        AS c,
                0        AS r
         FROM   incident i
                JOIN dp p
                  ON ( p.nom_dp = i.nom_dp )
         WHERE  CONVERT (VARCHAR(10), i.date_cou, 103) = '01/01/2010'
         GROUP  BY p.nom_dd,
                   i.date_cou)
        UNION
        (SELECT p.nom_dd,
                0,
                COUNT(*),
                0
         FROM   accident a
                JOIN dp p
                  ON p.nom_dp = a.nom_dp
         WHERE  CONVERT (VARCHAR(10), a.date_acc, 103) = '26/05/2011'
         GROUP  BY p.nom_dd,
                   a.date_acc)
        UNION
        (SELECT nom_dd,
                0,
                0,
                COUNT(*)
         FROM   travaux
         WHERE  CONVERT (VARCHAR(10), datecou_tra, 103) = '27/05/2011'
         GROUP  BY nom_dd,
                   datecou_tra))AS tt
    ON tt.nom_DD = DD.nom_DD
GROUP  BY ROLLUP(tt.nom_dd)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/06/2011, 21h10   #12
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Bravoooooooooooooooooooooooooo aieeeuuuuu

Vous m'avez sauvé Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

Je suis Hyper contente , Le plus beau c votre pseudo, dés que j'ai eu le bon résultat j'ai crié aieeeuuuuuuuuuuuuuuuuuuuu

Franchement je vous tire chapeau vous m'avez beaucoup aidé

Mille Merci

PS: pour le totale, ca na pas marché, SqlServer M'affiche le message suivant :

Citation:
'ROLLUP' n'est pas un nom de fonction reconnu

Merci Génie aieeeuuuu
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 11h18   #13
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
c'est trop

pour le ROLLUP, désolé, je n'avais pas vu le

Citation:
je travaille avec SqlServer2000
Sous 2000 pas de rollup, la clause COMPUTE (dépréciée depuis) peut être une alternative mais vous aurez deux jeux de résultats..

Vous pouvez aussi faire un union...

Mais le mieux, si vous le pouvez, est encore d'effectuer ce total coté client
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/06/2011, 00h00   #14
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 258
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 258
Points : 26
Points : 26
Merci aieeeuuuuu

Voila j'ai essai de rajouté Le COMPUTE comme vous m'avez proposé mais en fessant des recherches sur cette fonction, j'ai remarqué que cette fonction n'est pas accepté par le JDBC de Java, Alors j'ai préférée l'évité puisque j'ai besoin de cette requête sur java, Donc je vais mettre ce statut sur Résolu, et je vais laissé tombé ce Totale

Je vous remercié encore une fois pour votre Attention
info3licen est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h34.


 
 
 
 
Partenaires

Hébergement Web