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 :

[SQL2K] Clause "With" ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Par défaut [SQL2K] Clause "With" ?
    Bonjour à tous,

    Je cherche à calculer un nombre d'appels téléphoniques moyen grâce à la clause SQL With et je n'y arrive pas !

    Code SQL :
    WITH t1 AS ( SELECT *
    FROM APPEL
    WHERE DATEPART(year, DATE_APPEL)=2009
    AND DATEPART(month, DATE_APPEL)=04
    AND I_AP_C_M IN('val1', 'val2', ' ')
    ) SELECT (count(t2.NO_APPEL) / count(t1.NO_APPEL)) AS NB_APPEL_MOYEN
    FROM t1, APPEL
    WHERE I_AP_HT_NIV IN (2,3)
    AND t1.DATE_APPEL = DATE_APPEL
    AND t1.I_AP_C_M = I_AP_C_M

    Me renvoi "SQL Server ne connaît à côté de With" ... ou quelque chose comme ça !



    Même comme ça, ça ne fonctionne pas !

    Code SQL :
    SELECT (count(t2.NO_APPEL) / count(t1.NO_APPEL)) AS NB_APPEL_MOYEN
    FROM APPEL t1, APPEL t2
    WHERE DATEPART(year, t1.DATE_APPEL)=2009
    AND DATEPART(month, t1.DATE_APPEL)=04
    AND t1.I_AP_C_M IN('val1', 'val2', ' ')
    AND t1.DATE_APPEL = t2.DATE_APPEL
    AND t1.I_AP_C_M = t2.I_AP_C_M
    AND t2.I_AP_HT_NIV IN (2,3)

    Me renvoi "1" !!! Car, count(t2.NO_APPEL) = count(t1.NO_APPEL) = 276 ... la même valeur !!!


    Gôm

  2. #2
    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
    La clause With et donc les tables CTE ne sont pas présentent dans SQL Server 2000 d'ou le 1er message d'erreur.
    Ensuite vous souhaitez calculer une moyenne du nombre d'appel mais par rapport à quel critère?
    Par exemple si vous souhaitez calculer le nombre moyen d'appel par niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT t1.I_AP_HT_NIV, AVG(t1.NO_APPEL)) AS NB_APPEL_MOYEN
    FROM APPEL t1
    WHERE DATEPART(year, t1.DATE_APPEL)=2009 
    AND DATEPART(month, t1.DATE_APPEL)=04 
    AND t1.I_AP_C_M IN('val1', 'val2', ' ') 
    AND t1.DATE_APPEL = t2.DATE_APPEL 
    AND t1.I_AP_HT_NIV IN (2,3)
    GROUP BY t1.I_AP_HT_NIV;

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Par défaut
    Citation Envoyé par jero44 Voir le message
    La clause With et donc les tables CTE ne sont pas présentent dans SQL Server 2000 d'ou le 1er message d'erreur.



    Citation Envoyé par jero44 Voir le message
    Ensuite vous souhaitez calculer une moyenne du nombre d'appel mais par rapport à quel critère?
    Par exemple si vous souhaitez calculer le nombre moyen d'appel par niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT t1.I_AP_HT_NIV, AVG(t1.NO_APPEL)) AS NB_APPEL_MOYEN
    FROM APPEL t1
    WHERE DATEPART(year, t1.DATE_APPEL)=2009 
    AND DATEPART(month, t1.DATE_APPEL)=04 
    AND t1.I_AP_C_M IN('val1', 'val2', ' ') 
    AND t1.DATE_APPEL = t2.DATE_APPEL 
    AND t1.I_AP_HT_NIV IN (2,3)
    GROUP BY t1.I_AP_HT_NIV;
    Je souhaite faire la division (et donc le ratio, la moyenne) entre le nombre d'appels total que me ramènent ces critères là (que je voulais donc mettre dans un "with") :

    Code SQL :
    SELECT count(NO_APPEL) AS NB_APPEL_TOT
    FROM APPEL
    WHERE DATEPART(year, DATE_APPEL)=2009
    AND
    DATEPART(month, DATE_APPEL)=04
    AND
    I_AP_C_M IN('val1', 'val2', ' ')


    et le nombre d'appels que me ramène ce critère là :

    Code SQL :
    SELECT count(NO_APPEL) AS NB_APPEL_PRECIS
    FROM APPEL
    WHERE DATEPART(year, DATE_APPEL)=2009
    AND
    DATEPART(month, DATE_APPEL)=04
    AND I_AP_C_M IN('val1', 'val2', ' ')
    AND
    I_AP_HT_NIV IN (2,3)



    C'est pourquoi j'avais essayé de mettre tout ça dans une seule et même requête :

    Code SQL :
    SELECT (count(t2.NO_APPEL) / count(t1.NO_APPEL)) AS NB_APPEL_MOYEN
    FROM APPEL t1, APPEL t2
    WHERE DATEPART(year, t1.DATE_APPEL)=2009
    AND
    DATEPART(month, t1.DATE_APPEL)=04
    AND
    t1.I_AP_C_M IN('val1', 'val2', ' ')
    AND t1.DATE_APPEL = t2.DATE_APPEL
    AND t1.I_AP_C_M = t2.I_AP_C_M
    AND t2.I_AP_HT_NIV IN (2,3)



    M'y prendrais-je mal ?

    Gôm

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
        count(*) AS NB_APPEL_TOT
        sum(case when I_AP_HT_NIV IN (2,3) then 1 else 0 end) AS NB_APPEL_PRECIS,
        sum(case when I_AP_HT_NIV IN (2,3) then 1 else 0 end) / count(*) AS RATIO
    FROM
        APPEL
    WHERE
        DATE_APPEL >= cast('2009-04-01' as datetime)
    AND DATE_APPEL <  cast('2009-05-01' as datetime) 
    AND I_AP_C_M IN ('val1', 'val2', ' ')

  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
    Le problème provient sans doute de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND t1.DATE_APPEL = t2.DATE_APPEL
    car la colonne date_appel est sans doute de type datetime et du coup seul les appels de t2 correspondant à une date et heure précise de T1 sont retenus.
    Donc ce code doit répondre à votre soucis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT (count(t2.NO_APPEL) / count(t1.NO_APPEL)) AS NB_APPEL_MOYEN
    FROM APPEL t1, APPEL t2
    WHERE DATEPART(year, t1.DATE_APPEL)=2009 
    AND DATEPART(month, t1.DATE_APPEL)=04 
    AND DATEPART(year, t2.DATE_APPEL)=2009 
    AND DATEPART(month, t2.DATE_APPEL)=04 
    AND t1.I_AP_C_M IN('val1', 'val2', ' ') 
    AND t1.I_AP_C_M = t2.I_AP_C_M
    AND t2.I_AP_HT_NIV IN (2,3)

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Par défaut
    Citation Envoyé par jero44 Voir le message
    Le problème provient sans doute de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND t1.DATE_APPEL = t2.DATE_APPEL
    car la colonne date_appel est sans doute de type datetime et du coup seul les appels de t2 correspondant à une date et heure précise de T1 sont retenus.
    Donc ce code doit répondre à votre soucis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT (count(t2.NO_APPEL) / count(t1.NO_APPEL)) AS NB_APPEL_MOYEN
    FROM APPEL t1, APPEL t2
    WHERE DATEPART(year, t1.DATE_APPEL)=2009 
    AND DATEPART(month, t1.DATE_APPEL)=04 
    AND DATEPART(year, t2.DATE_APPEL)=2009 
    AND DATEPART(month, t2.DATE_APPEL)=04 
    AND t1.I_AP_C_M IN('val1', 'val2', ' ') 
    AND t1.I_AP_C_M = t2.I_AP_C_M
    AND t2.I_AP_HT_NIV IN (2,3)

    Non, ça ne fonctionne pas non plus !

    count(t1.NO_APPEL) et count(t2.NO_APPEL) me ramène avec ta requête le nombre total d'enregistrements présents dans ma table APPEL !

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Par défaut
    @Waldar :


    La date est au format américain donc c'est "année-jour-mois" et non "année-mois-jour" comme tu l'avais écrit.

    Malheureusement même avec cette légère correction, ça ne fonctionne pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
        count(*) AS NB_APPEL_TOT
        sum(case when I_AP_HT_NIV IN (2,3) then 1 else 0 end) AS NB_APPEL_PRECIS,
        cast(sum(case when I_AP_HT_NIV IN (2,3) then 1 else 0 end) / count(*) as numeric) AS RATIO
    FROM
        APPEL
    WHERE
        DATE_APPEL >= cast('2009-01-04' AS datetime)
    AND DATE_APPEL <  cast('2009-01-05' AS datetime) 
    AND I_AP_C_M IN ('val1', 'val2', ' ')
    Ca me ramène :

    __________________________________________
    |_NB_APPEL_TOT_|_NB_APPEL_PRECIS_|_RATIO_|
    |_____1204______|_______205_______|___0___|


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

Discussions similaires

  1. Variable d'une clause where avec quote
    Par kcizth dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/04/2008, 15h43

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