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 :

[hard core] requête dur dur


Sujet :

MS SQL Server

  1. #1
    Membre confirmé Avatar de heid
    Profil pro
    Inscrit en
    mai 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : mai 2002
    Messages : 388
    Points : 587
    Points
    587
    Par défaut [hard core] requête dur dur
    Bonjour,
    j'ai un léger problème avec une requete sql.
    Je travail sur une table Compte.
    Un seul champ m'intéresse, la date de création (CreatedOn) qui est un datetime.

    Mon but final est de créer une courbe sur le nombre de compte en fonction du temps.
    J'utilise sql reporting services, je dois donc créer une requête qui me renverra ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DATE               Nombre total
    juin 2005         1
    Juillet 2005       5 
    Novembre 2005 8
    le nombre total étant le nombre total de comptes au mois en question et non pas seulement le nombre de compte créés par mois.

    pour cela, je sais faire un group by me permettant de connaitre le nombre de compte créés par mois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select DATENAME(month, createdOn) + ' ' + DATENAME(yy, createdOn) AS Mois_Année,count(*) as somme
    from account act1
    where statecode = 0
    group by 
    DATENAME(month, createdOn) + ' ' + DATENAME(yy, createdOn)
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    août 2004	3
    août 2005	6
    avril 2004	4
    février 2005 1
    février 2006 1
    juin 2004	3
    mai 2004	2
    novembre 2004 5
    octobre 2005 1
    Il faudrait donc que je fasse la requête qui me renvoi le nombre la somme des comptes créés précédement groupé par mois.

    j'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select DATENAME(month, createdOn) + ' ' + DATENAME(yy, createdOn) AS Mois_Année,count(*) as somme,
    sum( 
    	(select count(*) as 'somme' from account act2
    	where statecode= 0
    	And act2.createdOn<=act1.createdOn
    	group by
    	DATENAME(month, createdOn) + ' ' + DATENAME(yy, createdOn))
        )
    from account act1
    where statecode = 0
    group by 
    DATENAME(month, createdOn) + ' ' + DATENAME(yy, createdOn)
    Mais sql server me jette gentiment en précisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Serveur*: Msg 130, Niveau 15, État 1, Ligne 8
    Impossible d'exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous-requête.
    Merci d'avance, j'espère avoir été clair.

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    octobre 2002
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2002
    Messages : 4 184
    Points : 19 413
    Points
    19 413
    Billets dans le blog
    25
    Par défaut
    Passez par une table temporaire, puis une jointure plutôt que par une sous-requête
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    mars 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 77
    Points : 90
    Points
    90
    Par défaut
    salut essaye ça pour voir ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select dates.*, count(*)
    from (select distinct month(createdon) as Mois, year(createdon) as Annee from account) dates,
    account a
    where month(createdon) <= dates.mois and year(createdon) <= dates.Annee
    group by mois, annee
    voilà j'espère que ça marche et que ça te convient ...

  4. #4
    Membre confirmé Avatar de heid
    Profil pro
    Inscrit en
    mai 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : mai 2002
    Messages : 388
    Points : 587
    Points
    587
    Par défaut
    Merci pour vos réponses.
    ca me renvoi ceci :

    4 2004 5
    5 2004 7
    6 2004 12
    8 2004 16
    11 2004 21
    2 2005 1
    8 2005 23
    10 2005 24
    2 2006 3
    ce qui n'est pas logique vu que le nombre de droite est forcément croissant.


    Pour la table temporaire ca me semble pas possibler pusque la table temporaire dépend de la ligne en cours dans la requête...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    mars 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 77
    Points : 90
    Points
    90
    Par défaut
    autant pour moi, je me suis foiré dans les dates ...

    pitite correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select dates.*, count(*)
    from (select distinct month(createdon) as Mois, year(createdon) as Annee from account) dates,
    account a
    where year(createdon) < dates.Annee or (year(createdon) = dates.Annee and month(createdon) <= dates.Mois)
    group by mois, annee

  6. #6
    Membre confirmé Avatar de heid
    Profil pro
    Inscrit en
    mai 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : mai 2002
    Messages : 388
    Points : 587
    Points
    587
    Par défaut
    Bon, ben j'ai pas tout compris

    je l'ai modifié pour afficher une date "lisible"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select dates.*, count(*) 
    from (select distinct DATENAME(month, createdOn) + ' ' + DATENAME(yy, createdOn)as 'mois_An', month(createdon) as Mois, year(createdon) as Annee from account) dates, 
    account a 
    where year(createdon) < dates.Annee or (year(createdon) = dates.Annee and month(createdon) <= dates.Mois) 
    group by mois_An,mois, annee
    order by Annee,mois
    et ca marche nikel (du grand art).
    Un grand merci.

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

Discussions similaires

  1. [Data] Faire des requêtes en dur avec des DAO
    Par hocinema dans le forum Spring
    Réponses: 8
    Dernier message: 22/04/2010, 10h50
  2. [AC-2003] Récupérer le contenu d'une requête "en dur" dans un recordset
    Par buzz73 dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/07/2009, 21h12
  3. [MySQL] Requête imbriquée dur dur
    Par nebil dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 08/07/2006, 13h26
  4. Pthread et stdio dur dur
    Par greg13 dans le forum Linux
    Réponses: 3
    Dernier message: 21/03/2006, 23h56
  5. Dur dur Mandriva et Nvidia
    Par Cazaux-Moutou-Philippe dans le forum Mandriva / Mageia
    Réponses: 5
    Dernier message: 19/03/2006, 04h07

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