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 :

SQL SERVER 2005 - Group by + Cumul


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut SQL SERVER 2005 - Group by + Cumul
    Bonjour,

    veuillez trouver en pièce jointe mon 'problème'.
    J'ai une table avec 2 colonnes : date et type (tableau de gauche)

    J'ai déja une requete qui me permet de grouper par date, et me donner le nombre de types différents pour chacune des dates (tableau du milieu).

    J'aimerai maintenant trouver une requete qui me permet de grouper par date, et me donner le cumul des differents types.
    - C'est a dire que pour le 01.01.2011, j'ai 3 types différents
    - Pour le 02.01.2011, j'ai 3 types différents depuis le 01.01.2011 jusqu'au 02.01.2011
    - Pour le 03.01.2011, j'ai 5 types différents depuis le 01.01.2011 jusqu'a 03.01.2011.
    - Ainsi de suite.

    J'ai donc besoin de valeur unique, cumuléee..

    J'espère avoir bien explicité mon problème.

    Merci d'avance.
    Images attachées Images attachées  

  2. #2
    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
    Bonjour,

    Voici :

    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
    ;WITH
    	CTE AS
    	(
    		SELECT	DISTINCT [date]
    			, (
    				SELECT	DISTINCT [type] + ','
    				FROM	dbo.maTable AS S
    				WHERE	S.date = T.date
    				FOR XML PATH('')
    			) AS cumul
    		FROM	dbo.maTable AS T
    	)
    SELECT	date
    	, LEFT(cumul, LEN(cumul) - 1) AS cumul
    FROM	CTE
    @++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Merci pour cette proposition.

    Par contre, je souhaite avoir le nombre du cumul (pas les différents types cumulés). Il me faut donc la deuxième colonne dans mon exemple (dont le nombre augmenterait jour apres jours). La troisième ne servait qu'a explicité mon souhait.

    Pourriez-vous corriger votre code ? A défaut, je vais essayer de chipoter un peu de mon coté..


    Merci d'avance.

    je suppose que je dois modifier ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT	DISTINCT COUNT([type])
    FROM	dbo.maTable AS S
    WHERE	S.date = T.date

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
    T1.Date, COUNT(*)
    FROM (
     SELECT DISTINCT DATE
     FROM maTable
    ) AS T1(Date)
    INNER JOIN maTable AS T2 ON (
     T2.Date <= T1.Date
    )
    GROUP BY T1.Date

  5. #5
    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
    Voici :

    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
    ;WITH
    	CTE AS
    	(
    		SELECT	[date]
    			, COUNT(DISTINCT [type]) AS distinct_count
    			, (
    				SELECT	DISTINCT [type] + ','
    				FROM	dbo.maTable AS S
    				WHERE	S.date = T.date
    				FOR XML PATH('')
    			) AS cumul
    		FROM	dbo.maTable AS T
    		GROUP	BY [date]
    	)
    SELECT	date
    	, distinct_count
    	, LEFT(cumul, LEN(cumul) - 1) AS cumul
    FROM	CTE
    En ce qui concerne FOR XML PATH, l'ajout de cette clause permet normalement de retourner un document XML formé à partir du résultat de la requête, et donc chaque élément est qualifié par un nœud dont le nom est celui de la colonne dont est issue la valeur.

    Dans la requête, je force le nom de la colonne à "chaîne vide", donc je n'ai que des éléments <type>.
    Comme j'ai cumulé la valeur avec une virgule (+ ', '), le nœud type n'existe pas, et j'ai donc seulement les valeurs trouvées dans la colonne.

    C'est une petite astuce qui est la plus légère (en temps d'exécution et en consommation de ressources) lorsqu'on souhaite "cumuler" des valeurs comme ici.

    En revanche c'est bien sûr anti-relationnel.

    @++

  6. #6
    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
    SergeJack, votre requête retourne un total cumulé des occurrences ...

    @++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Voici :

    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
    ;WITH
    	CTE AS
    	(
    		SELECT	[date]
    			, COUNT(DISTINCT [type]) AS distinct_count
    			, (
    				SELECT	DISTINCT [type] + ','
    				FROM	dbo.maTable AS S
    				WHERE	S.date = T.date
    				FOR XML PATH('')
    			) AS cumul
    		FROM	dbo.maTable AS T
    		GROUP	BY [date]
    	)
    SELECT	date
    	, distinct_count
    	, LEFT(cumul, LEN(cumul) - 1) AS cumul
    FROM	CTE
    -
    Ce code ci ne me cumule pas mes valeurs..
    J'obtiens exactement les memes résultats avec mon code ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select	 date, COUNT(DISTINCT type)
    FROM	 EP0126A_104
    WHERE	 datebetween '20110103' and '201101005'
    group by date
    Qu'est-ce qui cloche ?

  8. #8
    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
    Dans ce cas j'ai du mal comprendre, et la requête de SergeJack est correcte.
    Je pensais que vous parliez du champ Distinct de votre fichier Excel.

    Pouvez-vous donner le nom du champ de votre fichier Excel que vous souhaitez voir cumulé ?

    @++

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2010, 09h54
  2. MS SQL-Server 2005 & Groupes Windows
    Par _Snoopy dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/10/2010, 16h29
  3. Réponses: 0
    Dernier message: 05/03/2008, 17h16
  4. [SQL Server 2005] Valeurs cumulées
    Par noax86 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/06/2007, 15h03

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