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

Développement SQL Server Discussion :

Clause WITH - multiples


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Points : 70
    Points
    70
    Par défaut Clause WITH - multiples
    Bonjour,
    Je souhaiterais avoir une requete de ce type, mais ce n'est pas possible sous SQL-server 2005.
    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
    --------------------------------------------- Nb jours PRODUCTION
    with Jour_Prod (JousProd,Affaire)as
    (
    	select 
    		sum([Présence Réel Equipe]) as Nb_Jours,
    		[Document No_]
    	from dbo.[Production Chantier]
    	where No_ = 'PR'
    		and [Forecast Date] between '01/01/2000' and '31/07/2012'
    		and [Présence Réel Equipe]>0
    		and Région = 'CENTRE'
    	group by [Document No_]
    )
     
    --------------------------------------------- Nb jours PRODUCTION 2012
    with Jour_Prod_2012 (JousProd2012,Affaire)as
    (
    	select 
    		sum([Présence Réel Equipe]) as Nb_Jours,
    		[Document No_]
    	from dbo.[Production Chantier]
    	where No_ = 'PR'
    		and [Forecast Date] between '01/01/2012' and '31/07/2012'
    		and [Présence Réel Equipe]>0
    		and Région = 'CENTRE'
    	group by [Document No_]
    )
     
    --------------------------------------------------- Factures
    with Facturation (Affaire,Ingenieur,FactPhaseB)as
    (
    select 
    	Affaire as Affaire,	
    	max([Code Ingénieur]) as Ingenieur,
    	sum(cast([Phase B complet] as float)) as Fact_Phase_B
     
    from dbo.[Statistiques]
    where Région = 'CENTRE'
    group by Affaire
    order by Affaire
    )
     
    ------------------------------------------------------ Devis
    with Devis(Agence,Affaire,DevisPhaseB) as
    (
    select 
    	max([Responsibility Center]) as Agence,
    	[Job No_],
    	sum(cast([Line Amount]as float)) as Devis_phaseB
    from dbo.[Sales Line]
    where [Phase Code] = 'B'
    group by [Job No_]
    )
     
    	select 
    		T4.Agence,
    		T1.Affaire,
    		T1.JousProd,
    		T2.JousProd2012,		
    		T3.Ingenieur,
    		T3.FactPhaseB,
    		T4.DevisPhaseB
     
    	from dbo.[ Jour_Prod] T1
    		left outer join [Jour_Prod_2012] T2
    		on T1.Affaire = T2.Affaire
    			left outer join [Facturation] T3
    			on T1.Affaire = T3.Affaire 
    				left outer join [Devis] T4
    				on T1.Affaire = T4.Affaire
     
    	order by  T4.Agence,T1.Affaire,
    Comment puis je remplacer ou utiliser les differentes clauses WITH
    MERCI

  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 774
    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 774
    Points : 52 747
    Points
    52 747
    Billets dans le blog
    5
    Par défaut
    Il ne faut qu'un seul WITH (celui du départ) et séparer les différentes CTE par des virgules.
    À me lire : http://sqlpro.developpez.com/cours/s...te-recursives/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Il faut utiliser une seule fois l'instruction with et ensuite mettre des "," entre les différentes CTE:
    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
     
    --------------------------------------------- Nb jours PRODUCTION
    WITH Jour_Prod (JousProd,Affaire)AS
    (
    	SELECT 
    		sum([Présence Réel Equipe]) AS Nb_Jours,
    		[Document No_]
    	FROM dbo.[Production Chantier]
    	WHERE No_ = 'PR'
    		AND [Forecast Date] BETWEEN '01/01/2000' AND '31/07/2012'
    		AND [Présence Réel Equipe]>0
    		AND Région = 'CENTRE'
    	GROUP BY [Document No_]
    )
     
    --------------------------------------------- Nb jours PRODUCTION 2012
    , Jour_Prod_2012 (JousProd2012,Affaire)AS
    (
    	SELECT 
    		sum([Présence Réel Equipe]) AS Nb_Jours,
    		[Document No_]
    	FROM dbo.[Production Chantier]
    	WHERE No_ = 'PR'
    		AND [Forecast Date] BETWEEN '01/01/2012' AND '31/07/2012'
    		AND [Présence Réel Equipe]>0
    		AND Région = 'CENTRE'
    	GROUP BY [Document No_]
    )
     
    --------------------------------------------------- Factures
    , Facturation (Affaire,Ingenieur,FactPhaseB)AS
    (
    SELECT 
    	Affaire AS Affaire,	
    	max([Code Ingénieur]) AS Ingenieur,
    	sum(cast([Phase B complet] AS float)) AS Fact_Phase_B
     
    FROM dbo.[Statistiques]
    WHERE Région = 'CENTRE'
    GROUP BY Affaire
    --ORDER BY Affaire
    )
     
    ------------------------------------------------------ Devis
    , Devis(Agence,Affaire,DevisPhaseB) AS
    (
    SELECT 
    	max([Responsibility Center]) AS Agence,
    	[Job No_],
    	sum(cast([Line Amount]AS float)) AS Devis_phaseB
    FROM dbo.[Sales Line]
    WHERE [Phase Code] = 'B'
    GROUP BY [Job No_]
    )
     
    	SELECT 
    		T4.Agence,
    		T1.Affaire,
    		T1.JousProd,
    		T2.JousProd2012,		
    		T3.Ingenieur,
    		T3.FactPhaseB,
    		T4.DevisPhaseB
     
    	FROM dbo.[ Jour_Prod] T1
    		LEFT OUTER JOIN [Jour_Prod_2012] T2
    		ON T1.Affaire = T2.Affaire
    			LEFT OUTER JOIN [Facturation] T3
    			ON T1.Affaire = T3.Affaire 
    				LEFT OUTER JOIN [Devis] T4
    				ON T1.Affaire = T4.Affaire
     
    	ORDER BY  T4.Agence,T1.Affaire

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Points : 70
    Points
    70
    Par défaut
    Merci pour votre reponse

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 81
    Points : 145
    Points
    145
    Par défaut
    Je tiens d'ailleurs encore à vous remercier pour cet article qui m'a beaucoup aidé notamment pour faire de la cosmétique au niveau SQL ( Concaténation de plusieurs lignes en une seule).
    Je sais que faire de la cosmétique avec SQL c'est le mal, mais que voulez vous... Je ne suis que le DBA ici et je dois me plier aux décisions de mes managers / chefs de projets (En particulier limitation des coûts de développement des applications utilisées )
    Bien souvent on peut résumer les problèmes rencontrés par:

    select Cause from Error

    Results:
    Interface_Chaise_Clavier

    Bonne journée

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

Discussions similaires

  1. [9ir2] Utilisation de la clause WITH
    Par in dans le forum SQL
    Réponses: 9
    Dernier message: 19/09/2007, 10h27
  2. Réponses: 10
    Dernier message: 12/03/2007, 12h06
  3. Clause sur multiples champs 1 variable
    Par hugo69 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/10/2006, 17h10
  4. PB avec la clause WITH
    Par faflenrage dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 31/08/2006, 17h28
  5. [PL/SQL] curseur et clause WITH
    Par ljoly dans le forum Oracle
    Réponses: 6
    Dernier message: 24/01/2006, 14h26

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