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 2005] Pb de syntaxe


Sujet :

MS SQL Server

  1. #1
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut [SQL SERVER 2005] Pb de syntaxe
    Bonjour,

    je suis en train de migrer une requête qui fonctionnait sous informix en sqlserver 2005.
    Voici ma requête d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select ufocod, ufolib, sum(decode((select count(*) from parli rli where rli.rlinumser = parli.rlinumser 
    and rlidatdebval <= date(:par1)),0,decode((select count(*) from parli rli where rli.rlinumser = parli.rlinumser),
    0,( - ufodatdebval + ufodatdebval + date(:par2) - date(:par1) + 1) ,
    rlidatdebval - date(:par1)),0) + decode((select count(*) from parli rli where rli.rlinumser = parli.rlinumser 
    and (rlidatfinval is null or rlidatfinval >= date(:par2))),0,decode((select count(*) 
    from parli rli where rli.rlinumser = parli.rlinumser),0,0,date(:par2) - rlidatfinval + 1),0)) as NbJourInocc, 
    SUM(date(:par2) - date(:par1) + 1) as NbJourTot from stlit, stufo, outer(parli) 
    where stlit.ufonumser = stufo.ufonumser and parli.litnumser = stlit.litnumser 
    and rlidatdebval <= date(:par2) and (rlidatfinval is null or rlidatfinval >= date(:par1)) 
    and ufocod between :par3 and :par4 and litdis = 'O' GROUP BY 1,2 order by ufocod
    Voici ma requête modifiée :
    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
    select ufocod, ufolib, 
    sum(
    	 case (select count(*) from parli rli where rli.rlinumser = parli.rlinumser and rlidatdebval <= '01/01/2008')
    	 when 0 then case(select count(*) from parli rli where rli.rlinumser = parli.rlinumser) 
    				  when 0 then (- ufodatdebval + ufodatdebval + '31/12/2008' - '01/01/2008' + 1) 
         when (rlidatdebval - '01/01/2008') then 0
     
      + 
         case (select count(*) from parli rli where rli.rlinumser = parli.rlinumser and (rlidatfinval is null or rlidatfinval >= '31/12/2008'))
    	 when 0 then case (select count(*) from parli rli where rli.rlinumser = parli.rlinumser) 
    				  when 0 then 0
    	 when ('31/12/2008' - rlidatfinval + 1) then 0
       ) NbJourInocc  , 
     
    SUM('31/12/2008' - '01/01/2008' + 1)  NbJourTot 
     
    from stufo join stlit 
    				LEFT OUTER JOIN parli on stlit.litnumser = parlit.litnumser and rlidatdebval <= '31/12/2008' 
    											and (rlidatfinval is null or rlidatfinval >= '01/01/2008') 
    			on stufo.ufonumser = stlit.ufonumser 
    where  ufocod between 0 
    and 99999 and litdis = 'O' 
    GROUP BY 1,2 
    order by ufocod
    J'ai une erreur de syntaxe :
    Msg*102, Niveau*15, État*1, Ligne*4
    Syntaxe incorrecte vers ')'.
    Merci pour votre aide.
    Valoji
    SQL SERVER 2005 express

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Une piste il manque les End des select
    Citation Envoyé par msdn
    CASE input_expression
    WHEN when_expression THEN result_expression
    [ ...n ]
    [
    ELSE else_result_expression
    ]
    END
    A+
    Soazig

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Rebonjour,
    Voilà ce que cela donnerait.
    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
    SELECT   ufocod,
             ufolib,
             SUM(
                      CASE
                           (SELECT COUNT(*)
                           FROM    parli rli
                           WHERE   rli.rlinumser = parli.rlinumser
                               AND rlidatdebval <= '01/01/2008'
                           )
                               WHEN 0
                               THEN
                                        CASE
                                             (SELECT COUNT(*)
                                             FROM    parli rli
                                             WHERE   rli.rlinumser = parli.rlinumser
                                             )
                                                 WHEN 0
                                                 THEN (- ufodatdebval + ufodatdebval + '31/12/2008' - '01/01/2008' + 1)
                                        END
                               WHEN (
                                                 rlidatdebval - '01/01/2008'
                                        )
                               THEN 0
                      END +
                      CASE
                           (SELECT COUNT(*)
                           FROM    parli rli
                           WHERE   rli.rlinumser = parli.rlinumser
                               AND (
                                           rlidatfinval IS NULL
                                        OR rlidatfinval >= '31/12/2008'
                                   )
                           )
                               WHEN 0
                               THEN
                                        CASE
                                             (SELECT COUNT(*)
                                             FROM    parli rli
                                             WHERE   rli.rlinumser = parli.rlinumser
                                             )
                                                 WHEN 0
                                                 THEN 0
                                                 WHEN (
                                                                   '31/12/2008' - rlidatfinval + 1
                                                          )
                                                 THEN 0
                                        END )     NbJourInocc ,
             SUM('31/12/2008' - '01/01/2008' + 1) NbJourTot
    FROM     stufo
             JOIN stlit
             LEFT OUTER JOIN parli
             ON       stlit.litnumser = parlit.litnumser
                  AND rlidatdebval   <= '31/12/2008'
                  AND (
                               rlidatfinval IS NULL
                            OR rlidatfinval >= '01/01/2008'
                      )
             ON       stufo.ufonumser = stlit.ufonumser
    WHERE    ufocod BETWEEN 0 AND 99999
         AND litdis = 'O'
    GROUP BY 1,2
    ORDER BY ufocod
    mais je ne suis pas sure de mettre les end au bon endroit.
    PS: As tu remarqué que - ufodatdebval + ufodatdebval + '31/12/2008' - '01/01/2008' + 1
    cela peut s'écrire '31/12/2008' - '01/01/2008' + 1
    -x+x cela fait0 chez moi.
    Dans la requête informix c'était déjà comme cela.
    PS2. J'ai d'abord modifié ta requete puis j'ai utilisé http://sqlinform.com/ pour l'indenter
    A+
    Soazig

  4. #4
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    Bonjour,

    merçi pour l'adresse du site web, je ne connaissais pas. Par ailleurs, j'ai réutilisé la requête, mais j'ai de nouveaux des messages d'erreur :

    Voici la requête (Il manquait un end) :

    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
    SELECT   ufocod,
             ufolib,
             SUM(
                      CASE
                           (SELECT COUNT(*)
                           FROM    parli rli
                           WHERE   rli.rlinumser = parli.rlinumser
                               AND rlidatdebval <= '01/01/2008'
                           )
                               WHEN 0
                               THEN
                                        CASE
                                             (SELECT COUNT(*)
                                             FROM    parli rli
                                             WHERE   rli.rlinumser = parli.rlinumser
                                             )
                                                 WHEN 0
                                                 THEN (- ufodatdebval + ufodatdebval + '31/12/2008' - '01/01/2008' + 1)
                                        END
                               WHEN (
                                                 rlidatdebval - '01/01/2008'
                                        )
                               THEN 0
                      END +
                      CASE
                           (SELECT COUNT(*)
                           FROM    parli rli
                           WHERE   rli.rlinumser = parli.rlinumser
                               AND (
                                           rlidatfinval IS NULL
                                        OR rlidatfinval >= '31/12/2008'
                                   )
                           )
                               WHEN 0
                               THEN
                                        CASE
                                             (SELECT COUNT(*)
                                             FROM    parli rli
                                             WHERE   rli.rlinumser = parli.rlinumser
                                             )
                                                 WHEN 0
                                                 THEN 0
                                                 WHEN (
                                                                   '31/12/2008' - rlidatfinval + 1
                                                          )
                                                 THEN 0
                                        END 
    					END)     NbJourInocc ,
             SUM('31/12/2008' - '01/01/2008' + 1) NbJourTot
    FROM     stufo
             JOIN stlit
             LEFT OUTER JOIN parli
             ON       stlit.litnumser = parlit.litnumser
                  AND rlidatdebval   <= '31/12/2008'
                  AND (
                               rlidatfinval IS NULL
                            OR rlidatfinval >= '01/01/2008'
                      )
             ON       stufo.ufonumser = stlit.ufonumser
    WHERE    ufocod BETWEEN 0 AND 99999
         AND litdis = 'O'
    GROUP BY 1,2
    ORDER BY ufocod
    Voici les nouveaux messages d'erreur :

    Msg*4104, Niveau*16, État*1, Ligne*1
    L'identificateur en plusieurs parties "parlit.litnumser" ne peut pas être lié.
    Msg*130, Niveau*15, État*1, Ligne*1
    Impossible d'exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous-requête.
    Valoji .

  5. #5
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Par défaut
    Bonjour,
    tout d'abord je ne peux que vous inciter à lire la documentation SQL Server sur l'instruction SELECT : http://msdn.microsoft.com/fr-fr/library/ms189499.aspx. Vous serez ainsi en mesure de mieux ciomprendre ce qu'il est possible ou non de faire.
    En lisant votre requete j'ai remarqué:
    Il faut indiquer le nom des colonnes sur lesquelles vous faite le group by, donc dans votre cas:
    Ensuite et c'est cela votre problème: il n'est pas possible de faire le cumul : calcul d'agrégat/CASE/calcul d'agrégat. Il est donc nécessaire d'écrire différement votre requête.
    Pour simplifier l'écriture de votre requête pensez aux tables CTE, aux vues et aux fonctions.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Msg*4104, Niveau*16, État*1, Ligne*1
    L'identificateur en plusieurs parties "parlit.litnumser" ne peut pas être lié.
    C'est normal, relisez vous... tantôt vous avez mis PARLI (sans t) et d'autres fois PARLIT avec un T...

    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/ * * * * *

  7. #7
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    Bonjour,

    Merci pour vos réponse, j'ai suivi le conseil de Jero44 en utilisant les tables CTE

    Voici ma requête modifié :
    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
    With TabPrin (rlinumser, rlidatfinval , ufocod, ufolib)
    			AS (SELECT   parli.rlinumser, rlidatfinval ,  ufocod,ufolib
    				FROM     stufo
    				 JOIN stlit
    				 LEFT OUTER JOIN parli
    				 ON       stlit.litnumser = parli.litnumser
    					  AND rlidatdebval   <= '31/12/2008'
    					  AND (rlidatfinval IS NULL OR rlidatfinval >= '01/01/2008')
     
    				 ON       stufo.ufonumser = stlit.ufonumser
    				WHERE    ufocod BETWEEN 0 AND 99999
    				 AND litdis = 'O'
    				),
    		G1 (ufocod, ufolib, NBJourInocc)
    		as	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli inner JOIN TabPrin ON parli.rlinumser = tabprin.rlinumser
    														AND parli.rlidatdebval <= '01/01/2008'
     
    			group by ufocod, ufolib),
     
    		G2 (ufocod, ufolib, NB_Jour_Inocc)
    		as	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli inner JOIN TabPrin ON parli.rlinumser = tabprin.rlinumser							
    			group by ufocod, ufolib),
     
    		G3 (ufocod, ufolib, NB_Jour_Inocc)
    		as	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli inner JOIN TabPrin ON parli.rlinumser = tabprin.rlinumser
    								AND (parli.rlidatfinval IS NULL OR parli.rlidatfinval >= '31/12/2008')
     
    			group by ufocod, ufolib)
     
    select Tabprin.ufocod, Tabprin.ufolib, 
    	sum(case G1.NBjourInnoc when 0 then 
    									case G2 when 0 then ('31/12/2008' - '01/01/2008') 
    									end 
    		end 
    		+
            case G3.NBjourInnoc when 0 then 
    									case G2 when 0 then 0 
    									end
    							when ('31/12/2008' - rlidatfinval  +1) then 0
    		end
    		)
     from Tabprin inner join G1 on Tabprin.ufocod = G1.ufocod
    		      inner join G2 on Tabprin.ufocod = G2.ufocod
    			  inner join G3 on Tabprin.ufocod = G3.ufocod
    Voici mes messages d'erreur :
    Msg*207, Niveau*16, État*1, Ligne*35
    Nom de colonne non valide*: 'NBjourInnoc'.

    Msg*207, Niveau*16, État*1, Ligne*36
    Nom de colonne non valide*: 'G2'.

    Msg*207, Niveau*16, État*1, Ligne*40
    Nom de colonne non valide*: 'NBjourInnoc'.

    Msg*207, Niveau*16, État*1, Ligne*40
    Nom de colonne non valide*: 'NBjourInnoc'.

    Msg*207, Niveau*16, État*1, Ligne*41
    Nom de colonne non valide*: 'G2'.
    Pour précision c'est la 1ère fois que j'utilise les tables CTE, j'ai bien lu la docs : http://sqlpro.developpez.com/cours/s...te-recursives/

    et j'ai relu une bonne vingtaine de fois ma requête.

    Merci pour votre aide.
    Valoji

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    1 JOIN => 1 ON

    Vous mettez vos jointure mélangées après les JOIN. C'est illisible. De plus vous n'utilisez pas les alias de table. C'est illisible.
    Comment voulez vous relire une requête illisible ???

    Vos dates en chaine ne sont pas exprimées sous forme ISO (AAAAMMJJ)

    (PS : j'espère que tu fais pas de la moto comme tu écris tes requêtes, parce que là... je viendrais pas faire des balades avec toi ! http://brouardf.club.fr/index.html)

    Voici la première partie de votre requête mieux écrite :

    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
    WITH 
    TabPrin AS
    (SELECT parli.rlinumser, rlidatfinval ,ufocod, ufolib
     
     FROM   stufo AS SF
     
            INNER JOIN stlit AS SL
                  ON SF.ufonumser = SL.ufonumser
     
            LEFT OUTER JOIN parli AS PL
                  ON SL.litnumser = PL.litnumser
                     AND rlidatdebval   <= '20081231'
                     AND (rlidatfinval IS NULL OR rlidatfinval >= '20080101')
     
     WHERE  ufocod BETWEEN 0 AND 99999
    		AND litdis = 'O'),
    ...
    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/ * * * * *

  9. #9
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    Bonjour,

    Merci pour tes conseil SQLPRO,
    Depuis que nous sommes passé sous SQL SERVER, je m'inspire beaucoup de tes docs.
    Mais bon entre ce que j'ai appris pendant mes études et ce que je fais maintenant (ca n'a rien avoir). Je n'avais jamais uilisé les Inner join ou left outer.

    Mais bon là n'est pas le sujet.

    J'ai corrigé ma requête mais j'ai toujours des problèmes :
    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
     
    WITH tabPrin (rlinumser, rlidatfinval , ufocod, ufolib)
    		AS (SELECT   rli.rlinumser, rlidatfinval ,  ufocod,ufolib
    			FROM stufo as ufo
    			JOIN stlit lit
    				ON ufo.ufonumser = lit.ufonumser
    			LEFT OUTER JOIN parli rli
    				ON lit.litnumser = rli.litnumser
    					AND rlidatdebval   <= '20081231'
    					AND (rlidatfinval IS NULL OR rlidatfinval >= '20080101')				 
    			WHERE ufocod BETWEEN 0 AND 99999
    			AND litdis = 'O'
    				),
    	G1 (ufocod, ufolib, NBJourInocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    														AND rli.rlidatdebval <= '20080101'
     
    			GROUP BY ufocod, ufolib),
     
    	G2 (ufocod, ufolib, NBJour_Inocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser							
    			GROUP BY ufocod, ufolib),
     
    	G3 (ufocod, ufolib, NBJour_Inocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    								AND (rli.rlidatfinval IS NULL OR rli.rlidatfinval >= '20080101')
     
    			GROUP BY ufocod, ufolib)
     
     
     
    SELECT  tabprin.ufocod, tabprin.ufolib, 
    	sum(case G1.NBjourInnoc when 0 then 
    									case G2 when '0' then ('20081231' - '20080101') 
    									end 
    		end 
    		+
            case G3.NBjourInnoc when 0 then 
    									case G2 when 0 then 0 
    									end
    							when ('20081231' - rlidatfinval  +1) then 0
    		end
    		)
     FROM Tabprin LEFT OUTER JOIN G1 ON Tabprin.ufocod = G1.ufocod
    		      LEFT OUTER JOIN G2 ON Tabprin.ufocod = G2.ufocod
    			  LEFT OUTER JOIN G3 ON Tabprin.ufocod = G3.ufocod
    Mes messages d'erreurs :
    Msg*207, Niveau*16, État*1, Ligne*35
    Nom de colonne non valide*: 'NBjourInnoc'.

    Msg*207, Niveau*16, État*1, Ligne*36
    Nom de colonne non valide*: 'G2'.

    Msg*207, Niveau*16, État*1, Ligne*40
    Nom de colonne non valide*: 'NBjourInnoc'.

    Etc...
    Par contre si je fais une simple requête de selection, je n'ai aucun souci :

    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
    WITH tabPrin (rlinumser, rlidatfinval , ufocod, ufolib)
    		AS (SELECT   rli.rlinumser, rlidatfinval ,  ufocod,ufolib
    			FROM stufo as ufo
    			JOIN stlit lit
    				ON ufo.ufonumser = lit.ufonumser
    			LEFT OUTER JOIN parli rli
    				ON lit.litnumser = rli.litnumser
    					AND rlidatdebval   <= '20081231'
    					AND (rlidatfinval IS NULL OR rlidatfinval >= '20080101')				 
    			WHERE ufocod BETWEEN 0 AND 99999
    			AND litdis = 'O'
    				),
    	G1 (ufocod, ufolib, NBJourInocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    														AND rli.rlidatdebval <= '20080101'
     
    			GROUP BY ufocod, ufolib),
     
    	G2 (ufocod, ufolib, NBJour_Inocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser							
    			GROUP BY ufocod, ufolib),
     
    	G3 (ufocod, ufolib, NBJour_Inocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    								AND (rli.rlidatfinval IS NULL OR rli.rlidatfinval >= '20080101')
     
    			GROUP BY ufocod, ufolib)
     
     
     
    SELECT  *
     FROM Tabprin LEFT OUTER JOIN G1 ON Tabprin.ufocod = G1.ufocod
    		      LEFT OUTER JOIN G2 ON Tabprin.ufocod = G2.ufocod
    			  LEFT OUTER JOIN G3 ON Tabprin.ufocod = G3.ufocod
    Mon problème vient du sum case, mais la je bute un peu.

    Merçi pour votre aide.
    Valoji

    (PS : Concernant la moto ne t'inqiuète pas je me débrouille mieux que mes requêtes, dés que j'aurais un peu de temps j'irais voir votre site)

  10. #10
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    Petite erreur dans ma requête :

    [CODE]G2 (ufocod, ufolib, NBJour_Inocc)CODE] au lieu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    G2 (ufocod, ufolib, NBJourInocc)
    et

    [CODE]G3 (ufocod, ufolib, NBJour_Inocc)CODE] au lieu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    G3 (ufocod, ufolib, NBJourInocc)
    Valoji.

  11. #11
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    Bonjour,

    Un peu de repos fait du bien. en relisant ma requête il était sûr qu'elle ne pouvait pas fonctionné. Il est clair aussi que de temps en temps je ne prends assez de recul.

    Maintenant ma requête s'execute bien, mais je n'ai pas le résulat attendu.

    Voici ma requête :
    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
     
    WITH tabPrin (rlinumser, rlidatfinval , ufocod, ufolib)
    		AS (SELECT   rli.rlinumser, rlidatfinval ,  ufocod,ufolib
    			FROM stufo as ufo
    			JOIN stlit lit
    				ON ufo.ufonumser = lit.ufonumser
    			LEFT OUTER JOIN parli rli
    				ON lit.litnumser = rli.litnumser
    					AND rlidatdebval   <= '20081231'
    					AND (rlidatfinval IS NULL OR rlidatfinval >= '20080101')				 
    			WHERE ufocod BETWEEN 0 AND 99999
    			AND litdis = 'O'
    				),
    	G1 (ufocod, ufolib, NBJourInocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    														AND rli.rlidatdebval <= '20080101'
     
    			GROUP BY ufocod, ufolib),
     
    	G2 (ufocod, ufolib, NBJourInocc2)
    		 AS (SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser							
    			GROUP BY ufocod, ufolib),
     
    	G3 (ufocod, ufolib, NBJourInocc3)
    		 AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    								AND (rli.rlidatfinval IS NULL OR rli.rlidatfinval >= '20080101')
     
    			GROUP BY ufocod, ufolib)
     
    SELECT  tabprin.ufocod, tabprin.ufolib ,
    	 'Jour innoccupé' = 
    		sum(case when NBJourInocc  = 0 
    			 then case when NBJourInocc2 = 0
    				  then DATEDIFF(dd, '20081231', '20080101') 
    				  end
    			end
    		+
            case  when NBJourInocc3 = 0 
    			  then case when NBJourInocc2 = 0
    				   then 0 
    				   end			  				  
    			  when NBJourInocc3 = DATEDIFF(dd,rlidatfinval,'20081231') then 0
    		end)
     
     FROM Tabprin LEFT OUTER JOIN G1 ON Tabprin.ufocod = G1.ufocod
    LEFT OUTER JOIN G2 ON Tabprin.ufocod = G2.ufocod
    LEFT OUTER JOIN G3 ON Tabprin.ufocod = G3.ufocod
    group by tabprin.ufocod, tabprin.ufolib
    NBJourInocc1,NBJourInocc2,NBJourInocc3 ont comme valeur 'NULL'.
    Si je modifie ma requête dans ce sens là, il me renvoi toujours null dans le champ 'Jour innocupé' :

    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
     
    ....
    SELECT  tabprin.ufocod, tabprin.ufolib ,NBJourInocc,NBJourInocc2,NBJourInocc3,
    	 'Jour innoccupé' = 
    		sum(case when NBJourInocc  = NULL 
    			 then case when NBJourInocc2 = 0
    				  then DATEDIFF(dd, '20081231', '20080101') 
    				  end
    			end
    		+
            case  when NBJourInocc3 = NULL 
    			  then case when NBJourInocc2 = 0
    				   then 0 
    				   end			  				  
    			  when NBJourInocc3 = DATEDIFF(dd,rlidatfinval,'20081231') then 0
    		end)
     
     FROM Tabprin LEFT OUTER JOIN G1 ON Tabprin.ufocod = G1.ufocod
    LEFT OUTER JOIN G2 ON Tabprin.ufocod = G2.ufocod
    LEFT OUTER JOIN G3 ON Tabprin.ufocod = G3.ufocod
    group by tabprin.ufocod, tabprin.ufolib,NBJourInocc,NBJourInocc2,NBJourInocc3
    Je pense que le problème vient du type de données des NBJourInocc,NBJourInocc2,NBJourInocc3.
    Mais je ne voit pas comment faire ?

    Valoji.

  12. #12
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut [SQLEXPSERVER2005] optimiser query
    Bonjour,

    c'est bon je viens de trouver la solution :

    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
    WITH tabPrin (rlinumser, rlidatfinval , ufocod, ufolib)
    		AS (SELECT   rli.rlinumser, rlidatfinval ,  ufocod,ufolib
    			FROM stufo as ufo
    			JOIN stlit lit
    				ON ufo.ufonumser = lit.ufonumser
    			LEFT OUTER JOIN parli rli
    				ON lit.litnumser = rli.litnumser
    					AND rlidatdebval   <= '20081231'
    					AND (rlidatfinval IS NULL OR rlidatfinval >= '20080101')				 
    			WHERE ufocod BETWEEN 0 AND 99999
    			AND litdis = 'O'
    				),
    	G1 (ufocod, ufolib, NBJourInocc)
    		AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    														AND rli.rlidatdebval <= '20080101'
     
    			GROUP BY ufocod, ufolib),
     
    	G2 (ufocod, ufolib, NBJourInocc2)
    		 AS (SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser							
    			GROUP BY ufocod, ufolib),
     
    	G3 (ufocod, ufolib, NBJourInocc3)
    		 AS	(SELECT  ufocod, ufolib, COUNT(*)
    			FROM     parli rli INNER JOIN TabPrin prin ON rli.rlinumser = prin.rlinumser
    								AND (rli.rlidatfinval IS NULL OR rli.rlidatfinval >= '20080101')
     
    			GROUP BY ufocod, ufolib)
     
    SELECT  tabprin.ufocod, tabprin.ufolib ,NBJourInocc,NBJourInocc2,NBJourInocc3,
    	 'Jour innoccupé' = 
    		sum(case when COALESCE(NBJourInocc,0) = 0 
    			 then case when COALESCE(NBJourInocc2,0)  = 0
    				  then (DATEDIFF(dd, '01/01/2008', '31/12/2008')+1) 
    				  end
    			end
    		+
            case  when COALESCE(NBJourInocc3,0) = 0 
    			  then case when COALESCE(NBJourInocc2,0) = 0
    				   then 0 
    				   end			  				  
    			  when COALESCE(NBJourInocc3,0) = (DATEDIFF(dd,rlidatfinval,'31/12/2008') + 1) then 0
    		end)
     
     FROM Tabprin LEFT OUTER JOIN G1 ON Tabprin.ufocod = G1.ufocod
    LEFT OUTER JOIN G2 ON Tabprin.ufocod = G2.ufocod
    LEFT OUTER JOIN G3 ON Tabprin.ufocod = G3.ufocod
    group by tabprin.ufocod, tabprin.ufolib,NBJourInocc,NBJourInocc2,NBJourInocc3
    Merci à SQL PRO pour ces docs, elles sont super.

    Juste une dernière chose, je suis preneur si vous penser que ma requête peut être optimiser.

    Valoji

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Sans la description intégrale des tables avec contraintes et index et une idée de la distribution des données.... difficile de répondre !

    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/ * * * * *

  14. #14
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    OK, par manque de temps je ne peux pas pour l'instant.

    Mais j'ouvrirais un nouveau post en mettant la description des tables avec un jeu de données.

    Merci pour votre aide.

    Valoji

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

Discussions similaires

  1. sql server 2005:syntaxe ajout, modification, suppression
    Par wassim hamrouni dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/04/2011, 12h11

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