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 :

Requête croisée SQL [2000]


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2002
    Messages : 41
    Points : 42
    Points
    42
    Par défaut Requête croisée SQL
    Bonjour A Tous,

    Tout d'abord, une Bonne et Heureuse Année 2015 à l'équipe et à la communauté develloppez.com

    Je piétine sur cette requete, et je viens solliciter votre aide,
    A chaque execution de cette requete

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     CREATE   procedure [dbo].[PS_Historique_Ventes](
    	@DateDebut Datetime,
    	@DateFin Datetime
    )	
    as
    begin
     
    select YEAR(Date_ticket_reception)as ANNEE,  
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='CONSULTATION'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [CONSULTATION],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='CHAMBRE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [CHAMBRE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='EXAMEN'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [EXAMEN],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='HONORAIRE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [HONORAIRE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='ECHOGRAPHIE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [ECHOGRAPHIE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='RADIOLOGIE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [RADIOLOGIE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='CHIRURGIE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [CHIRURGIE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='MEDICAMENTS'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [MEDICAMENTS],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='ACCOUCHEMENT'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [ACCOUCHEMENT],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='PEDIATRIE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [PEDIATRIE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='SOINS MEDICAUX'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [SOINS MEDICAUX],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='CONTROLE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [CONTROLE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='VACCINATION'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [VACCINATION],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='ANESTHESIE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [ANESTHESIE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='TESTE SPÉCIAUX'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [TESTE SPÉCIAUX],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='FORFAIT'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [FORFAIT],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='REMISE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [REMISE],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='DEPLACEMENT'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [DEPLACEMENT],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='DEPLACEMENT & CONSULTATION'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [DEPLACEMENT & CONSULTATION],
     
    (select count (*) 
    FROM dbo.VUE_ACTE_MEDECIN1
    WHERE Libelle_famille_acte='DIABETOLOGIE'
    AND Libelle_famille_acte=VTE.Libelle_famille_acte) as [DIABETOLOGIE]
     
    from dbo.VUE_ACTE_MEDECIN1 VTE
    where VTE.Date_ticket_reception BETWEEN '01/01/2012' AND '31/12/2012'
    group by VUE_ACTE_MEDECIN1.Date_ticket_reception,VUE_ACTE_MEDECIN1.Libelle_famille_acte
     
    end
    go
    ,

    cette dernière me sort ce message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Serveur : Msg 107, Niveau  16, État 3, Procédure PS_Historique_Ventes, Ligne 8
    Le préfixe de colonne 'VUE_ACTE_MEDECIN1' ne correspond ni au nom de table ni au nom d'alias utilisés dans la requête.
    Serveur : Msg 107, Niveau  16, État 1, Procédure PS_Historique_Ventes, Ligne 8
    Le préfixe de colonne 'VUE_ACTE_MEDECIN1' ne correspond ni au nom de table ni au nom d'alias utilisés dans la requête.
    Merci de votre Aide

  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 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Nombreuses horreurs dans cette requête :
    1) des dates anormalement formée donnant des résultats hasardeux. Une date doit être spécifiée au format 'AAAA-MM-JJ' pour les types DATE et DETIME2 et 'AAAAMMJJ' pour le type DATETIME. Et rien d'autre !
    2) un GROUP BY qui donnera des résultats doublonnés (VUE_ACTE_MEDECIN1.Date_ticket_reception); il faut grouper sur le calcul de l'année : YEAR((VUE_ACTE_MEDECIN1.Date_ticket_reception)
    3) vous créez des variables, mais vous avez écrit en dur des valeurs de datetime
    4) un nombre épouvantable de requête identiques, dont les performances seront catastrophiques, synthétisable par une seule et même requête, performante !
    5) une sous requête multiple avec corrélation à la place d'une jointure
    6) le count(*) compte les lignes... Si un résultat est NULL il y a comptage quand même... Est-ce bien cela que vous voulez ?

    Bref votre requête peut se résumer à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT YEAR(VTE.Date_ticket_reception)as ANNEE,
           VAM.Libelle_famille_acte, 
           count (*) AS NOMBRE
    FROM   dbo.VUE_ACTE_MEDECIN1 VTE
           INNER JOIN dbo.VUE_ACTE_MEDECIN1 AS VAM
                 ON VAM.Libelle_famille_acte=VTE.Libelle_famille_acte
    WHERE  VTE.Date_ticket_reception BETWEEN '2012-01-01' AND '2012-12-31'
      AND  VAM.Libelle_famille_acte IN ('CONSULTATION', 'CHAMBRE', 'EXAMEN', 'HONORAIRE' )
    GROUP  BY YEAR(VTE.Date_ticket_reception), VTE.Libelle_famille_acte
    Enfin, votre erreur provient probablement du fait que vous lancez cette procédure dans le contexte d'une mauvaise base !

    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 du Club
    Inscrit en
    Septembre 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2002
    Messages : 41
    Points : 42
    Points
    42
    Par défaut
    Bonjour SQLPro,

    Encore merci pour tes precieux conseils, j'suis tout à fait d'occord avec toi, cette requete est une horreur.
    Mais ne dit-on pas que la nuit porte conseil!!
    Finalement, je suis arrivé à une solution plus digeste, je te laisse apprécier
    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
     
     
     
     
    CREATE    view V_STATS_BY_ACTES
    as
     
    SELECT     Libelle_Exercice as [EXERCICES],
    SUM(CASE WHEN Libelle_famille_acte='CONSULTATION' THEN qte ELSE 0 END) AS [CONSULTATION],
    SUM(CASE WHEN Libelle_famille_acte='CHAMBRE' THEN qte ELSE 0 END)AS [CHAMBRE],	
    SUM(CASE WHEN Libelle_famille_acte='EXAMEN' THEN qte ELSE 0 END)AS [EXAMEN],
    SUM(CASE WHEN Libelle_famille_acte='HONORAIRE' THEN qte ELSE 0 END)AS [HONORAIRE],
    SUM(CASE WHEN Libelle_famille_acte='ECHOGRAPHIE' THEN qte ELSE 0 END)AS [ECHOGRAPHIE],
    SUM(CASE WHEN Libelle_famille_acte='RADIOLOGIE' THEN qte ELSE 0 END)AS [RADIOLOGIE],
    SUM(CASE WHEN Libelle_famille_acte='CHIRURGIE' THEN qte ELSE 0 END)AS [CHIRURGIE],
    SUM(CASE WHEN Libelle_famille_acte='MEDICAMENTS' THEN qte ELSE 0 END)AS [MEDICAMENTS],
    SUM(CASE WHEN Libelle_famille_acte='ACCOUCHEMENT' THEN qte ELSE 0 END)AS [ACCOUCHEMENT],
    SUM(CASE WHEN Libelle_famille_acte='PEDIATRIE' THEN qte ELSE 0 END)AS [PEDIATRIE],
     
    SUM(CASE WHEN Libelle_famille_acte='SOINS MEDICAUX' THEN qte ELSE 0 END)AS [SOINS MEDICAUX],
    SUM(CASE WHEN Libelle_famille_acte='CONTROLE' THEN qte ELSE 0 END)AS [CONTROLE],
    SUM(CASE WHEN Libelle_famille_acte='VACCINATION' THEN qte ELSE 0 END)AS [VACCINATION],
    SUM(CASE WHEN Libelle_famille_acte='ANESTHESIE' THEN qte ELSE 0 END)AS [ANESTHESIE],
    SUM(CASE WHEN Libelle_famille_acte='TESTE SPÉCIAUX' THEN qte ELSE 0 END)AS [TESTE SPÉCIAUX],
    SUM(CASE WHEN Libelle_famille_acte='FORFAIT' THEN qte ELSE 0 END)AS [FORFAIT],
    SUM(CASE WHEN Libelle_famille_acte='REMISE' THEN qte ELSE 0 END)AS [REMISE],
    SUM(CASE WHEN Libelle_famille_acte='DEPLACEMENT' THEN qte ELSE 0 END)AS [DEPLACEMENT],
    SUM(CASE WHEN Libelle_famille_acte='DEPLACEMENT & CONSULTATION' THEN qte ELSE 0 END)AS [DEPLACEMENT & CONSULTATION],
    SUM(CASE WHEN Libelle_famille_acte='DIABETOLOGIE' THEN qte ELSE 0 END)AS [DIABETOLOGIE],
    SUM(qte) AS [Total]
    FROM _V_STATS_BY_ACTES
    group by Libelle_Exercice
    Encore merci pour votre aide

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

Discussions similaires

  1. Tuto sql et requéte croisée dynamique
    Par redoran dans le forum Débuter
    Réponses: 2
    Dernier message: 09/11/2010, 07h18
  2. requête croisée dans sql server 2005
    Par da_latifa dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 26/10/2009, 17h33
  3. requête croisée/sql server 2008 avec BI
    Par da_latifa dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/10/2009, 21h13
  4. [SQL] requête croisée sur 2 tables
    Par franckydeluka dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/01/2008, 11h48
  5. Requète croisée et affichage
    Par BakaOnigiri dans le forum SQL
    Réponses: 2
    Dernier message: 31/10/2002, 11h28

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