IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQL Server] [Débutant] Jointure de plusieurs vues


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [SQL Server] [Débutant] Jointure de plusieurs vues
    Bonjour.
    J'ai un problème avec les jointures, de vues en l'occurence, et vu que je n'ai pas trop l'habitude de me servir de ces dernières je suis un peu perdu.
    J'ai donc 4 vues structurées de la même facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT     hr_dossier AS Dossier, hr_semaine AS Semaine, SUM(hr_total) AS Valeur
    FROM         dbo.sc_heures
    GROUP BY hr_semaine, hr_dossier
    un champ Dossier (int uniquement), un champ semaine (int uniquement) et un champ Valeur(résultat d'une somme de real).

    Mon but est de regrouper ces 4 vues en une seule pour obtenir une vue de ce genre : Dossier, Semaine, Valeur_tbl1, Valeur_tbl2, Valeur_tbl3, Valeur_tbl4.
    J'ai essayé avec les jointures masi comme je l'ai déja précisé je me suis perdu completement. Est il possible de réaliser une opération de ce genre à partir des vues ou suis-je obligé de créer cette vue finale à partir des tables dont sont issues les vues ?

    Merci de bien vouloir eclairer ma lanterne

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 061
    Points
    53 061
    Billets dans le blog
    6
    Par défaut
    Sans le détail de vos vue et des tables sous jacents, difficile de vous expliquer comment faire.
    Commencez donc par respecter ceci :
    http://www.developpez.net/forums/showthread.php?t=944
    et par poster les ordres CREATE TABLE et CREATE VIEW de vos objets.

    Pour ce qui est du comment faire, il faut passer par des sous requêtes corrélées dans la clause SELECT de l'ordre SELECT.

    A +

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Les codes des tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    CREATE TABLE [dbo].[fr_divers](
        [fd_id] [int] IDENTITY(1,1) NOT NULL,
        [fd_dossier] [int] NOT NULL,
        [fd_frais] [nvarchar](50) COLLATE French_CI_AS NULL,
        [fd_designation] [nvarchar](50) COLLATE French_CI_AS NULL,
        [fd_quantite] [real] NULL,
        [fd_prix_u] [real] NULL,
        [fd_prix_t]  AS ([fd_quantite] * [fd_prix_u]),
        [fd_date] [datetime] NOT NULL,
        [fd_semaine]  AS (datepart(week,[fd_date])),
     CONSTRAINT [PK_fr_divers] PRIMARY KEY CLUSTERED
    (
        [fd_id] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]
     
    CREATE TABLE [dbo].[fr_four](
        [ff_id] [int] IDENTITY(1,1) NOT NULL,
        [ff_dossier] [int] NOT NULL,
        [ff_frais] [nvarchar](50) COLLATE French_CI_AS NULL,
        [ff_designation] [nvarchar](50) COLLATE French_CI_AS NULL,
        [ff_quantite] [real] NULL,
        [ff_prix_u] [real] NULL,
        [ff_prix_t]  AS ([ff_quantite] * [ff_prix_u]),
        [ff_date] [datetime] NOT NULL,
        [ff_semaine]  AS (datepart(week,[ff_date])),
     CONSTRAINT [PK_fr_four] PRIMARY KEY CLUSTERED 
    (
        [ff_id] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]
     
    CREATE TABLE [dbo].[fr_strait](
        [fs_id] [int] IDENTITY(1,1) NOT NULL,
        [fs_dossier] [int] NOT NULL,
        [fs_frais] [nvarchar](50) COLLATE French_CI_AS NULL,
        [fs_designation] [nvarchar](50) COLLATE French_CI_AS NULL,
        [fs_quantite] [real] NULL,
        [fs_prix_u] [real] NULL,
        [fs_prix_t]  AS ([fs_quantite] * [fs_prix_u]),
        [fs_date] [datetime] NOT NULL,
        [fs_semaine]  AS (datepart(week,[fs_date])),
     CONSTRAINT [PK_fr_strait] PRIMARY KEY CLUSTERED 
    (
        [fs_id] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]
     
    CREATE TABLE [dbo].[sc_heures](
        [hr_id] [int] IDENTITY(1,1) NOT NULL,
        [hr_dossier] [int] NOT NULL,
        [hr_semaine] [int] NOT NULL,
        [hr_nom] [nvarchar](50) COLLATE French_CI_AS NOT NULL,
        [hr_lundi] [real] NOT NULL CONSTRAINT [DF_sc_heures_hr_lundi]  DEFAULT (0),
        [hr_mardi] [real] NOT NULL CONSTRAINT [DF_sc_heures_hr_mardi]  DEFAULT (0),
        [hr_mercredi] [real] NOT NULL CONSTRAINT [DF_sc_heures_hr_mercredi]  DEFAULT (0),
        [hr_jeudi] [real] NOT NULL CONSTRAINT [DF_sc_heures_hr_jeudi]  DEFAULT (0),
        [hr_vendredi] [real] NOT NULL CONSTRAINT [DF_sc_heures_hr_vendredi]  DEFAULT (0),
        [hr_samedi] [real] NOT NULL CONSTRAINT [DF_sc_heures_hr_samedi]  DEFAULT (0),
        [hr_dimanche] [real] NOT NULL CONSTRAINT [DF_sc_heures_hr_dimanche]  DEFAULT (0),
        [hr_total]  AS ([hr_lundi] + [hr_mardi] + [hr_mercredi] + [hr_jeudi] + [hr_vendredi] + [hr_samedi] + [hr_dimanche]),
     CONSTRAINT [PK_sc_heures] PRIMARY KEY CLUSTERED 
    (
        [hr_id] ASC
    ) ON [PRIMARY],
     CONSTRAINT [UN_sc_heures] UNIQUE NONCLUSTERED 
    (
        [hr_dossier] ASC,
        [hr_semaine] ASC,
        [hr_nom] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]
    Les codes des vues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    CREATE VIEW [dbo].[sc_tt_heures]
    AS
    SELECT     hr_dossier AS dossier, hr_semaine AS semaine, SUM(hr_total) AS tt_heures
    FROM         dbo.sc_heures
    GROUP BY hr_semaine, hr_dossier
     
    CREATE VIEW [dbo].[sc_tt_strait]
    AS
    SELECT     fs_dossier AS dossier, fs_semaine AS semaine, SUM(fs_prix_t) AS tt_strait
    FROM         dbo.fr_strait
    GROUP BY fs_semaine, fs_dossier
     
    CREATE VIEW [dbo].[sc_tt_four]
    AS
    SELECT     ff_dossier AS dossier, ff_semaine AS semaine, SUM(ff_prix_t) AS tt_four
    FROM         dbo.fr_four
    GROUP BY ff_semaine, ff_dossier
     
    CREATE VIEW [dbo].[sc_tt_divers]
    AS
    SELECT     fd_dossier AS dossier, fd_semaine AS semaine, SUM(fd_prix_t) AS tt_divers
    FROM         dbo.fr_divers
    GROUP BY fd_semaine, fd_dossier

    Et le résultat que je voudrais obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DOSSIER    SEMAINE    TT_HEURES    TT_FOUR   TT_DIVERS    TT_STRAIT
    --------  ---------  -----------  ---------  ----------  -------
    120       1           50           0          21.5        45
    120       2           20           20.2       0           0
    420       1           15.5         245        255         0

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 061
    Points
    53 061
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT dossier, semaine, tt_heures,
           (SELECT tt_strait
            FROM   dbo.sc_tt_strait T2
            WHERE  T1.dossier = T2.dossier
              AND  T1.semaine = T2.semaine) AS tt_strait,
           (SELECT tt_four
            FROM   dbo.sc_tt_four T3
            WHERE  T1.dossier = T3.dossier
              AND  T1.semaine = T3.semaine) AS ff_prix_t,
           (SELECT tt_divers
            FROM   dbo.sc_tt_divers T4
            WHERE  T1.dossier = T4.dossier
              AND  T1.semaine = T4.semaine) AS fd_prix_t
     
    FROM   dbo.sc_tt_heures AS T1
    PS : achetez mon bouquin sur SQL !!!

    A +

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Ah oui c'est tres bien ça, cependant il a juste une petite chose. Si par exemple dans la table sc_heure il n'y a pas d'entrée pour une semaine d'un dossier, la vue ne retourne pas de resultat, même s'il y a des entrées dans les autres tables pour ce dossier et cette semaine. Car il est possible de ne pas avoir forcement d'entrée pour un couple dossier/semaine pour une des tables.
    Est-ce possible de faire en sorte que ces lignes aparaissent ?

    J'ai une table ou je stocke mes infos sur les dossiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE [dbo].[co_dossiers](
        [do_id] [int] IDENTITY(1,1) NOT NULL,
        [do_numero] [int] NOT NULL,
        [do_client] [nvarchar](50) COLLATE French_CI_AS NULL,
        [do_responsable] [nvarchar](50) COLLATE French_CI_AS NULL,
     CONSTRAINT [PK_co_dossiers] PRIMARY KEY CLUSTERED 
    (
        [do_id] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    Le champ dossier des autres tables/vues correspond à co_dossiers.do_id qui est la Pimary Key de co_dossier.
    J'ai essayé de me servir de cette table mais sans résultat.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bon j'ai donc trouvé la solution à mon probleme, voici le code de la vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    SELECT     TOP 100 PERCENT dossier, semaine, tot_heures, tot_strait, tot_four, tot_divers
    FROM         (SELECT     dossier, semaine,
                                                      (SELECT     tt_heures
                                                        FROM          dbo.sc_tt_heures AS T1
                                                        WHERE      (T.dossier = dossier) AND (T.semaine = semaine)) AS tot_heures,
                                                      (SELECT     tt_strait
                                                        FROM          dbo.sc_tt_strait AS T2
                                                        WHERE      (T.dossier = dossier) AND (T.semaine = semaine)) AS tot_strait,
                                                      (SELECT     tt_four
                                                        FROM          dbo.sc_tt_four AS T3
                                                        WHERE      (T.dossier = dossier) AND (T.semaine = semaine)) AS tot_four,
                                                      (SELECT     tt_divers
                                                        FROM          dbo.sc_tt_divers AS T4
                                                        WHERE      (T.dossier = dossier) AND (T.semaine = semaine)) AS tot_divers
                           FROM          (SELECT     dbo.co_dossiers.do_id AS dossier, derivedtbl_1.semaine
                                                   FROM          dbo.co_dossiers CROSS JOIN
                                                                              (SELECT DISTINCT fd_semaine AS semaine
                                                                                FROM          dbo.fr_divers
                                                                                UNION
                                                                                SELECT DISTINCT fs_semaine
                                                                                FROM         dbo.fr_strait
                                                                                UNION
                                                                                SELECT DISTINCT ff_semaine
                                                                                FROM         dbo.fr_four
                                                                                UNION
                                                                                SELECT DISTINCT hr_semaine
                                                                                FROM         dbo.sc_heures) AS derivedtbl_1) AS T) AS TT
    WHERE     (tot_heures <> 0) OR
                          (tot_four <> 0) OR
                          (tot_divers <> 0) OR
                          (tot_strait <> 0)
    ORDER BY dossier, semaine
    En fait je fait un Cross Join entre les différentes semaines utilsiées dans les tables et les dossiers existants et je me sers du resultat pour un Select suivant le code de SQLpro (qui m'a bien aidé). Apres il ne me reste plus qu'à faire un tri en éliminant les ligne où tous les totaux sont nuls ou de valeur 0 avec un Where.
    Par contre je ne sais pas si ma requette est 'propre' donc tout commentaire est bienvenu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL Server] Delete jointure
    Par diaboloche dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/02/2007, 14h22
  2. [SQL Server] auto increment dans une vue
    Par pimousse_cerise dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/05/2006, 10h18
  3. [SQL server 2000] jointures de 3 tables
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/04/2006, 09h45
  4. sql-server 2000 généralités sur sql-server ( débutant)
    Par ducho dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 28/02/2006, 18h10
  5. Access plus rapide que SQL server ????? (débutante)
    Par 24 faubourg dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 21/12/2005, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo