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 :

Retourner premiere ligne et count dans la même requête


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut Retourner premiere ligne et count dans la même requête
    Bonjour,

    voici mon problème je dois retourner une liste de contacts pour ça je dois pioché dans 4 tables:
    - Exploitant (Entreprise)
    - Fournisseur (Entreprise)
    - Banque (Entreprise)
    - Utilisateur (Personne) (c'est celle qui contient mes personnes physiques liée à mes 3 autres tables)

    Je dois retourner indifféremment toutes les entreprises en plus de toutes les personnes qui sont liés à ces entreprises.
    Les données que je dois retourner sont la raison sociale de l'entreprise dans le cas où le contact est une entreprise, le nombre de contact associé (dans la table utilisateur) et les coordonnées du premier contact associé.


    J'ai donc crée une vue qui fait un union all du tout mais je coince sur la requête pour les entreprises comme je veux retourner à la fois le nombre de contact associé et le premier contact de l'entreprise ça coince, voici ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *, (Select count(*) from dbo.UTILISATEUR where UTILISATEUR.ID_PARENT=BANQUE.ID_Banque and UTILISATEUR.CODE='BANQUE') as NbContact from dbo.BANQUE left outer join UTILISATEUR on UTILISATEUR.ID = (
        select top(1) ID from UTILISATEUR
        where UTILISATEUR.ID_PARENT = BANQUE.ID_Banque and UTILISATEUR.CODE='BANQUE'
        order by UTILISATEUR.ID 
    )
    N'y a t-il pas un moyen plus élégant pour que mon (Select count(*)) dans ma liste de colonne surtout que je le fais 3 fois dans ma vue (une fois pour chaque type d'entreprise) ?

    Merci pour vos réponses.

  2. #2
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez utiliser une CTE avec des fonctions de fenêtrage pour obtenir les informations voulues, et filtrer dessus :

    Sur ce principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH CTE AS (
        SELECT *
            ,    RANK() OVER(PARTITION BY ??? ORDER BY ???) AS Rn
            ,    COUNT() OVER(PARTITION BY ???) AS Cnt
        FROM ....
    )
    SELECT ???, Cnt
    FROM CTE
    WHERE Rn = 1

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    CTE tout seule non ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH Entreprises (id, nom, nb) as
    (
       select b.id, b.nom, count(u.*) from banque b inner join utilisateur u on u.parent_id = b.id and u.code = 'BANQUE' group by b.id, b.nom
       union all
       select b.id, b.nom, count(u.*) from exploitant b inner join utilisateur u on u.parent_id = b.id and u.code = 'EXPLOITANT' group by b.id, b.nom
       union all
       select b.id, b.nom, count(u.*) from fournisseur b inner join utilisateur u on u.parent_id = b.id and u.code = 'FOURNISSEUR' group by b.id, b.nom
    )
    select u.id, u.nom, e.nb, u.coordonnees
    from utilisateur u
    left outer join entreprises e on e.id = u.id
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Bonjour,

    merci pour vos réponses, l'utilisation d'une CTE m'a même pas traversé l'esprit (j'en ai utilisé seulement pour la gestion de hiérarchie).

    Je vais testé ça et voire si ça résout mes problèmes de param sniffing.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Bonjour,

    merci pour vos réponses, l'utilisation d'une CTE m'a même pas traversé l'esprit (j'en ai utilisé seulement pour la gestion de hiérarchie).

    Je vais testé ça et voire si ça résout mes problèmes de param sniffing.
    N'oubliez pas de nous indiquez si vos problème de paramètre sniffing, de clignotement de l'écran et de l’odeur bizarre se dégageant de vos barrettes ram se résout.

    Ha, je me rend compte que vous n'avez posé aucune question sur ces trois problèmes... au temps pour moi :p
    Most Valued Pas mvp

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    J'ai téléchargé de la ram sur internet et j'ai toujours du paramètre sniffing je ne comprends pas.

    Pour le paramètre sniffing j'ai contourné le problème en filtrant en c# plutôt que sur la requête.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    J'ai téléchargé de la ram sur internet et j'ai toujours du paramètre sniffing je ne comprends pas.

    Pour le paramètre sniffing j'ai contourné le problème en filtrant en c# plutôt que sur la requête.
    La solution la plus radicale (et non moins valide) contre le paramètre sniffing est bien de générer les query dynamiquement.

    Par contre, les faire en SQL dans des procédures plutôt qu'en C# (ou autre), offre l'avantage de conserver une séparation entre les couches
    Most Valued Pas mvp

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    La solution la plus radicale (et non moins valide) contre le paramètre sniffing est bien de générer les query dynamiquement.

    Par contre, les faire en SQL dans des procédures plutôt qu'en C# (ou autre), offre l'avantage de conserver une séparation entre les couches
    Le problème c'est que j'utilise EntityFramework pour interroger ma vue, c'est donc lui qui me génère la requête qui pose problème, et comme j'ai pas vraiment la main sur ce qu'il génère (même s'il est possible de le surcharger), j'ai préféré le faire en c# étant donné que le flot de donnée n'est pas très important et que ça dure seulement quelque ms pour le faire.

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

Discussions similaires

  1. Plusieurs count() dans une même requête
    Par DarkaMaul dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/11/2009, 17h20
  2. faire plusieur count dans une même requète
    Par bossLINDROS dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/04/2008, 10h04
  3. DISTINCT + COUNT dans la même requête, possible ?
    Par Invité dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/04/2008, 11h25
  4. plusieurs count dans la même requete
    Par lmorali dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/05/2007, 10h17
  5. [SQL2K] Deux count dans une même requete
    Par maitrebn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/02/2007, 17h12

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