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 :

écrire une requete


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut écrire une requete
    Bonjour,

    ma table s'appelle abonnement et renferme les champs id_abonnement(clé auto increment),date_abo(format jj-mm-aaaa) et je voudrai écrire une requete qui me renvoie le nombre d'abonnés par mois cumulé par année. c'est à dire compter le nombre d'abonnés par mois de l'année en commençant par le mois de Avril 2004 ainsi de suite jusqu'à juillet 2006. exemple:s'il ya eu 50 abonnés en Avril 2004 et 78 en Mai 2004, j'aimerais que la requete me renvoie Avril 2004 50 et Mai 2004 50+78 ainsi de suite.

    merci de votre aide

  2. #2
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    Dans quelle table et quel champs est stocké le nombre d'abonné?

  3. #3
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Quelque chose comme 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
     
    CREATE TABLE #abonnement (AbonnementId int IDENTITY(1,1), dateAbo smalldatetime)
     
    INSERT INTO #abonnement (dateAbo) VALUES ('20060401')
    INSERT INTO #abonnement (dateAbo) VALUES ('20060410')
    INSERT INTO #abonnement (dateAbo) VALUES ('20060521')
    INSERT INTO #abonnement (dateAbo) VALUES ('20060601')
    INSERT INTO #abonnement (dateAbo) VALUES ('20060611')
    INSERT INTO #abonnement (dateAbo) VALUES ('20060612')
    GO
     
    SELECT YEAR(a1.dateAbo) as Annee,  MONTH(a1.dateAbo) as Mois, COUNT(DISTINCT a2.AbonnementId) as NombreCumule
    FROM	#abonnement a1
    CROSS JOIN #abonnement a2
    WHERE a2.AbonnementId <= a1.AbonnementId
    GROUP BY YEAR(a1.dateAbo), MONTH(a1.dateAbo)
    ORDER BY YEAR(a1.dateAbo), MONTH(a1.dateAbo)
    GO
     
    DROP TABLE #abonnement

  4. #4
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut
    c'est la requete qui doit compter le nombre d'abonnés en fonction des id_abonnement(unique) par mois

    merci

  5. #5
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut
    que signifie "CROSS JOIN #abonnement a2"

    merci

  6. #6
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573

  7. #7
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut
    Vous faites la jointure avec la même table abonement?

    merci

  8. #8
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut
    ça ne marche pas, je cherche encore

  9. #9
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut
    merci j'avais fait une erreur sur ce que vous m'avez proposé, ça marche

  10. #10
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut
    excusez moi, ça n'a pas marché comme il faut,
    voici ma requete:select MONTH(date_validation) as Mois,YEAR(date_validation) as Annee,count(distinct id_utilisateur) as nb
    from cart_abonnements (nolock)
    where (date_validation is not null)
    GROUP BY YEAR(date_validation), MONTH(date_validation)
    order by YEAR(date_validation),MONTH(date_validation) faire le cumul du nombre d'abonnés. C'est à dire si le mois de Janvier a 25 abonnés, et le mois de Fevrier 50, je veut avoir Janvier 25 et fevrier 75

    merci de votre aide

  11. #11
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Rebonjour,

    Si je comprends bien la requête que tu envoies (merci d'utiliser les balises [CODE] pour le bien être de tous), le CROSS JOIN ne te plaisait pas trop, alors tu t'es dis qu'en l'enlevant ça irait mieux ?
    Surprise ! Il était là pour une raison ! As-tu lu le document sur les jointures ?

    Le but ici est de faire un produit cartésien de la table, avec elle-même, et de filtrer ce résultat pour trouver le nombre total de lignes antérieures... Bon, ok, tu veux la solution toute cuite au lieu de l'explication, d'accord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select MONTH(a1.date_validation) as Mois,YEAR(a1.date_validation) as Annee, count(distinct a2.id_utilisateur) as nb
    from dbo.cart_abonnements a1
    cross join dbo.cart_abonnements a2
    where (date_validation is not null) and
    	a2.id_utilisateur <= a1.id_utilisateur
    GROUP BY YEAR(a1.date_validation), MONTH(a1.date_validation)
    order by YEAR(a1.date_validation),MONTH(a1.date_validation)
    (code non testé cette fois-ci)

    De plus, merci de faire et pas , cette syntaxe est dépréciée

    EDIT : ceci dit, en voyant le nom de la colonne : id_utilisateur, est-ce que c'est une clé unique sur ta table abonnements ?

  12. #12
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    ... et en plus ce que je fais est totalement incorrect, désolé. Attends un moment, je poste qqch de correct.

  13. #13
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Voilà, mon raisonnement était vraiment mauvais. Voici quelque chose de mieux : attention, ça présuppose que ton id_utilisateur est unique dans la table cart_abonnements.

    Merci à l'avenir de poster le code de création de ta table, ça évite de perdre beaucoup de temps à créer des tables temporaires pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT	YEAR(a1.date_validation) as Annee,  
    	MONTH(a1.date_validation) as Mois, 
    	COUNT(DISTINCT a2.id_utilisateur) as NombreCumule
    FROM	dbo.cart_abonnements a1
    JOIN	dbo.cart_abonnements a2 ON 
    		CONVERT(char(6), a1.date_validation, 112) >= 
    		CONVERT(char(6), a2.date_validation, 112)
    GROUP BY YEAR(a1.date_validation), MONTH(a1.date_validation)
    ORDER BY YEAR(a1.date_validation), MONTH(a1.date_validation)

  14. #14
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Par défaut
    merci mais le cumul ne marche que pour le 2eme mois

  15. #15
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    De rien, mais de mon côté, le cumul marche pour tous les mois.

    Citation Envoyé par rudib
    attention, ça présuppose que ton id_utilisateur est unique dans la table cart_abonnements.
    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
     
    CREATE TABLE dbo.cart_abonnements (id_utilisateur int primary key, date_validation datetime)
    GO
     
    INSERT INTO dbo.cart_abonnements VALUES (12, '20060101')
    INSERT INTO dbo.cart_abonnements VALUES (24, '20060111')
    INSERT INTO dbo.cart_abonnements VALUES (356, '20060201')
    INSERT INTO dbo.cart_abonnements VALUES (1, '20060211')
    INSERT INTO dbo.cart_abonnements VALUES (22, '20060211')
    INSERT INTO dbo.cart_abonnements VALUES (156, '20060301')
    INSERT INTO dbo.cart_abonnements VALUES (234, '20060311')
    INSERT INTO dbo.cart_abonnements VALUES (56, '20060401')
    INSERT INTO dbo.cart_abonnements VALUES (123, '20060411')
    INSERT INTO dbo.cart_abonnements VALUES (2, '20060421')
    INSERT INTO dbo.cart_abonnements VALUES (5, '20060411')
    INSERT INTO dbo.cart_abonnements VALUES (7, '20060521')
    INSERT INTO dbo.cart_abonnements VALUES (125, '20060501')
    INSERT INTO dbo.cart_abonnements VALUES (21, '20060511')
    INSERT INTO dbo.cart_abonnements VALUES (33, '20060601')
    GO
     
    SELECT	YEAR(a1.date_validation) as Annee,  
    	MONTH(a1.date_validation) as Mois, 
    	COUNT(DISTINCT a2.id_utilisateur) as NombreCumule
    FROM	dbo.cart_abonnements a1
    JOIN	dbo.cart_abonnements a2 ON 
    		CONVERT(char(6), a1.date_validation, 112) >= 
    		CONVERT(char(6), a2.date_validation, 112)
    GROUP BY YEAR(a1.date_validation), MONTH(a1.date_validation)
    ORDER BY YEAR(a1.date_validation), MONTH(a1.date_validation)
    GO
     
    DROP TABLE dbo.cart_abonnements
    GO

Discussions similaires

  1. écrire une requete xpath sur Birt
    Par simplyc dans le forum BIRT
    Réponses: 0
    Dernier message: 16/05/2014, 16h32
  2. Réponses: 3
    Dernier message: 22/08/2011, 13h34
  3. Réponses: 5
    Dernier message: 12/04/2009, 10h23
  4. aide pour écrire une requete imbriquée
    Par DonKnacki dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/03/2008, 15h13
  5. [VB6] [Excel] Résultat d'une requete ds une feuille
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/01/2003, 17h52

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