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 du Club
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Points : 49
    Points
    49
    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 actif 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
    Points : 248
    Points
    248
    Par défaut
    Dans quelle table et quel champs est stocké le nombre d'abonné?

  3. #3
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    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
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  4. #4
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Points : 49
    Points
    49
    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 du Club
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Points : 49
    Points
    49
    Par défaut
    que signifie "CROSS JOIN #abonnement a2"

    merci

  6. #6
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

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

    merci

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

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

  10. #10
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 108
    Points : 49
    Points
    49
    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
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    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 ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  12. #12
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    Par défaut
    ... et en plus ce que je fais est totalement incorrect, désolé. Attends un moment, je poste qqch de correct.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  13. #13
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    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)
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

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

  15. #15
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    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
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

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