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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    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 067
    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
    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 confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    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

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    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 067
    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
    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

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    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 067
    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.

+ 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