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 :

[SQL2017][T-SQL] Plusieurs COUNT imbriqué dans un select avec SET pour récupérer la valeur


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 18
    Par défaut [SQL2017][T-SQL] Plusieurs COUNT imbriqué dans un select avec SET pour récupérer la valeur
    Bonsoir,

    J'ai un problème de syntaxte pour la création de ma fonction (je n'ai mis que la partie qui coince), SQL me surligne en rouge les SET ainsi que la dernière parenthèse de chacun de mes SELECT.
    J'imagine que c'est une bêtise, mais cela fait plusieurs heures que je cherche sur divers forums / tutoriaux sans trouver la réponse adéquate...

    Je cherche a récupérer la valeur des SELECT COUNT, le tout imbriqué dans un appel SELECT.

    Si je sépare mes deux SELECT, cela fonctionne... mais j'aimerais réellement réussir à les imbriquer dans un SELECT afin de n'avoir qu'un accès à la base de données.

    Je précise que je suis évidemment novice en SQL (mais cela j'imagine que vous l'aurez remarqué lol)

    Voici mon code:

    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
    DECLARE @Id_Vol INT
    SET @Id_Vol = 2
     
    DECLARE @Nbre_Clients INT
    DECLARE @Nbre_Acc INT
     
    SELECT(
    SET @Nbre_Clients = (SELECT COUNT(RES_Client_Id)
    FROM Reservation, Planning
    WHERE PLA_Vol_Id = @Id_Vol
    AND PLA_Id = RES_Pla_Id))
    (SET @Nbre_Acc = (SELECT COUNT(ACC_Id)
    FROM Reservation, Planning, Accompagnateur
    WHERE PLA_Vol_Id = @Id_Vol
    AND PLA_Id = RES_Pla_Id
    AND ACC_Res_Id = RES_Id))

    Voici le(s) message(s) d'erreur(s) obtenu(s):

    Msg 156, Level 15, State 1, Line 14
    Syntaxe incorrecte vers le mot clé 'SET'.
    Msg 102, Level 15, State 1, Line 17
    Syntaxe incorrecte vers ')'.
    Msg 102, Level 15, State 1, Line 22
    Syntaxe incorrecte vers ')'.
    Merci d'avance pour votre aide ;-)

    Korpin

  2. #2
    Invité
    Invité(e)
    Par défaut
    Vous devriez commencer par apprendre le SQL (Les jointures, c'est pas pour les chiens) et le T-SQL (la syntaxe de base)

    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
    DECLARE @Id_Vol INT
    SET @Id_Vol = 2
     
    DECLARE @Nbre_Clients INT
    DECLARE @Nbre_Acc INT
     
    SELECT @Nbre_Clients  = COUNT(RES_Client_Id)
    FROM Reservation, Planning
    WHERE PLA_Vol_Id = @Id_Vol
    AND PLA_Id = RES_Pla_Id
     
    SELECT @Nbre_Acc = COUNT(ACC_Id)
    FROM Reservation, Planning, Accompagnateur
    WHERE PLA_Vol_Id = @Id_Vol
    AND PLA_Id = RES_Pla_Id
    AND ACC_Res_Id = RES_Id

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 18
    Par défaut
    Bonsoir,

    Merci pour votre aide.

    OK pour les jointures (je les connais mais cela fonctionne également avec mon type de code... j'imagine que cela est plus "opti" du coup! Je modifierai donc avec jointures).

    Pour la syntaxe et votre proposition... ok mais dans votre cas vous effectuez 2 SELECT séparés... hors j'essaye d'effectuer 1 SELECT englobant les 2 SELECT (j'ai cru comprendre que c'était plus optimal). Mais cela est peut-être inutile, spécialement dans mon cas?

    Merci d'avance,

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Korpin Voir le message
    Pour la syntaxe et votre proposition... ok mais dans votre cas vous effectuez 2 SELECT séparés... hors j'essaye d'effectuer 1 SELECT englobant les 2 SELECT (j'ai cru comprendre que c'était plus optimal). Mais cela est peut-être inutile, spécialement dans mon cas?
    Commencez par faire du code qui marche.
    Sans vouloir être condescendant, chaque chose en son temps, l'optimisation, c'est pour plus tard, quand on maîtrise ce que l'on fait.
    Et de toute façon, vos résultats émanent de deux requêtes distinctes, ça ne risque pas de simplifier les choses.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 623
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Vous devriez commencer par apprendre le SQL (Les jointures, c'est pas pour les chiens) et le T-SQL (la syntaxe de base)
    Sauf que votre réponse utilise des jointures antédiluviennes

    Avec des jointures normalisées, ça donne ceci :
    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
    DECLARE @Id_Vol INT
    SET @Id_Vol = 2
     
    DECLARE @Nbre_Clients INT
    DECLARE @Nbre_Acc INT
     
     
    SELECT @Nbre_Clients=COUNT(RES_Client_Id)
    FROM Reservation RE
    inner join Planning PL
       on PL.PLA_Id = RE.RES_Pla_Id
    WHERE PLA_Vol_Id = @Id_Vol
     
    SELECT @Nbre_Acc=COUNT(ACC_Id)
    FROM Reservation RE
    inner join Planning PL
       on PL.PLA_Id = RE.RES_Pla_Id
    inner join Accompagnateur AC 
       on AC.ACC_Res_Id = RE.RES_Id
    WHERE PLA_Vol_Id = @Id_Vol

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Sauf que votre réponse utilise des jointures antédiluviennes
    C'est ce que j'ai écrit mais je n'ai pas mâché tout le travail non plus...

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 18
    Par défaut
    Bonjour,

    Merci pour l'aide et vos réponses même si je vous avoue être un peu déconcerté car finalement ce n'est pas réellement la réponse à ma question.. En effet, je sais effectuer une jointure (ou plusieurs jointures) et j'avais indiqué dans le post initial que j'étais capable de faire les 2 SELECT de manière séparée comme vous l'avez fait.. ce qui me posais problème était justement le SELECT qui englobe 2 SELECT..

    Ce n'est pas grave, si cela fonctionne tel quel et que cela n'est pas un "problème" de laisser mes SELECT séparés, je vais les laisser séparés

    Bonne journée

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,


    Pour répondre à la question initiale, vous pouvez faire un truc dans ce genre là, mais ça reste sans doute à adapter (voire carrément faux) en fonction du modèle que vous n'avez pas indiqué, des multiplicités, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
             @Nbre_Clients=COUNT(DISTINCT R.RES_Client_Id)
        ,    @Nbre_Acc = COUNT(DISTINCT A.ACC_Id) -- ou sans distinct, en fonction du besoin
    FROM Planning AS P
    INNER JOIN Reservation AS R
        ON P.PLA_Id = R.RES_Pla_Id
    INNER JOIN  Accompagnateur AS A
        ON A.ACC_Res_Id = R.RES_Id
    WHERE P.PLA_Vol_Id = @Id_Vol

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/08/2008, 18h04
  2. [SQL Server] Sous Requete dans le select
    Par Le Singe dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/11/2006, 09h11
  3. [PL/SQL] utilisation de variables dans un select?
    Par Dr Kraft dans le forum SQL
    Réponses: 8
    Dernier message: 11/10/2006, 10h17
  4. [interbase][SQL] concatener 2 champs dans le select
    Par Harry dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/03/2006, 06h45
  5. Réponses: 5
    Dernier message: 20/09/2005, 14h39

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