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

MS SQL Server Discussion :

Query : technique avancée : Répartition des id pour un champ GROUP BY


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Par défaut Query : technique avancée : Répartition des id pour un champ GROUP BY
    Bonjour,


    Je cherche une technique de requête spéciale pour analyse la répartition des id par rapport à un champ donné.

    Mieux vaut un exemple.

    Table
    ------
    Vente (IdVente, DateDeVente)

    Données
    --------
    IdVente, DateDeVente
    1, 1/1/2007
    2, 1/1/2007
    3, 2/1/2007
    4, 2/1/2007
    5, 2/1/2007
    6, 1/1/2007


    Résultat de la requête
    ----------------------
    IdVenteMin, IdVenteMax, DateDeVente
    1, 2, 1/1/2007
    3, 5, 2/1/2007
    6, 6, 1/1/2007


    Respect à celui qui trouve


    Grégoire

  2. #2
    Membre expérimenté Avatar de Cpas2latarte
    Inscrit en
    Janvier 2006
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 237
    Par défaut
    SI j'ai bien compris, ce que tu veux faire, Il existe avec MySQL une instruction (GROUP_CONCAT).
    Par contre je ne connais pas d'equivalence avec MS SQL Server.
    Cela dit, avec un curseur et quelques FETCH tu dois pouvoir t'en sortir.

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    ça ne fonctionne pas avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT MIN(IdVente), MAX(IdVente), CONVERT(VARCHAR, DateDeVente, 102)
    FROM dbo.maTable
    GROUP BY CONVERT(VARCHAR, DateDeVente, 102)
    ORDER BY CONVERT(VARCHAR, DateDeVente, 102)
    ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Par défaut
    Finalement, j'ai fait un curseur

    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
    IF OBJECT_ID('tempdb..#ResultsAnalyseID') IS NOT NULL 
        DROP TABLE #ResultsAnalyseID
     
    CREATE TABLE #ResultsAnalyseID (MinID INT, MaxID INT, AnalysedValue VARCHAR(50))
     
     
    DECLARE @CurrentAnalyzedValue VARCHAR(50)
    DECLARE @CurrentId            INT 
    DECLARE @AnalyzedValue        VARCHAR(50)
    DECLARE @MinID                INT
    DECLARE @MaxID                INT
     
    SELECT @CurrentAnalyzedValue = ''
    SELECT @CurrentId            = -1
    SELECT @AnalyzedValue        = ''
    SELECT @MinID                = -1
    SELECT @MaxID                = -1
     
    DECLARE C_AnalyseID CURSOR 
    FOR   
       SELECT AB.AccountBalanceID, CONVERT(VARCHAR(10), AB.DateSolde, 105) 
       FROM   AccountBalance AB
       ORDER  BY AB.AccountBalanceID
     
    OPEN C_AnalyseID
     
    FETCH C_AnalyseID INTO @CurrentId, @CurrentAnalyzedValue
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
         SELECT @AnalyzedValue = @CurrentAnalyzedValue
         SELECT @MinID = @CurrentId     
     
         WHILE @@FETCH_STATUS = 0 AND @AnalyzedValue = @CurrentAnalyzedValue
         BEGIN
     
              SELECT @MaxID = @CurrentId
              FETCH C_AnalyseID INTO @CurrentId, @CurrentAnalyzedValue
     
         END
     
         INSERT INTO #ResultsAnalyseID VALUES (@MinID, @MaxID, @AnalyzedValue)
     
    END
     
    CLOSE C_AnalyseID
    DEALLOCATE C_AnalyseID
     
     
    SELECT * , MaxID - MinID + 1 as NbrItems FROM #ResultsAnalyseID

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Vous pouvez utiliser la fonction de fenêtrage NTILE en SQL 2005 qui permet de faire des paquets.

    Je n'ai pas de v 2005 sous la main, donc je vous donne un approximation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MIN(IdVente) AS DEBUT_TRANCEH, 
           MAX(IdVente) AS FIN TRANCHE,
           PAQUET AS TRANCHE, DATE_VENTE
    FROM   (SELECT *, NTILE(3) OVER(ORDER BY IdVente) AS PAQUET
            FROM dbo.maTable) AS T
    GROUP  BY PAQUET, DATE_VENTE
    GROUP_CONCAT n'existe pas en SQL et est un truc propriétaire de MySQL...

    En revanche les fonctions de fenêtrages sont dans la norme SQL:2003 et présentes aussi sous Oracle et IBM Db2.

    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/ * * * * *

Discussions similaires

  1. Répartition des participants pour un speed-meeting
    Par Kijer dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 09/02/2024, 16h08
  2. Intégrer des calendriers pour les champs de saisie des dates
    Par xaviermfx dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 25/07/2012, 00h21
  3. Réponses: 0
    Dernier message: 27/04/2010, 17h05
  4. Mysql : choix des types pour les champs entre :
    Par Thierry8 dans le forum Administration
    Réponses: 3
    Dernier message: 14/06/2006, 08h22
  5. La technique des portail pour les moteur 3D
    Par Heptaeon dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/10/2005, 16h57

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