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 :

Regroupement et jointure sur une seule table


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 6
    Par défaut Regroupement et jointure sur une seule table
    Sur base d'une table : Date - Client - Quantité (écritures multiples par client et par date), je souhaite présenter par client, l'évolution des quantités sur 5 ans : 2009 (évol 2009) 2008 (évol 2008) 2007 (évol 2007) 2006 ...etc.

    Je pense que la construction serait la suivante :
    N records par date et par client doivent donc être sommée par année par client
    Les sommes obtenues doivent être regroupées par client (sur 1 ligne...)
    et puis finalement le pourcentage d'évolution année par année pourra être calculé par client.

    Quelle est la meilleure approche ?
    D'avance merci pour tout truc en la matière.
    "Bleu" en SQL

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ca va faire râler les anti-cosmétiques (car celà reste une requête "en dur"), mais vous pouvez faire ainsi à partir de SQL Server 2005 :
    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
    WITH ventes (id_client, dt_vente, qte) AS
    (
    select 1, cast('2006-03-05' as smalldatetime), 1 union all
    select 1, cast('2007-04-06' as smalldatetime), 3 union all
    select 1, cast('2008-02-15' as smalldatetime), 5 union all
    select 1, cast('2009-12-25' as smalldatetime), 7 union all
    select 2, cast('2006-03-05' as smalldatetime), 2 union all
    select 2, cast('2007-05-12' as smalldatetime), 4 union all
    select 2, cast('2008-09-23' as smalldatetime), 6 union all
    select 2, cast('2009-11-29' as smalldatetime), 8 union all
    select 2, cast('2009-07-05' as smalldatetime), 2 union all
    select 2, cast('2006-03-05' as smalldatetime), 4 union all
    select 3, cast('2006-03-05' as smalldatetime), 1 union all
    select 3, cast('2006-03-05' as smalldatetime), 2 union all
    select 3, cast('2006-03-05' as smalldatetime), 3 union all
    select 4, cast('2009-09-21' as smalldatetime), 4 union all
    select 5, cast('2003-10-22' as smalldatetime), 5
    )
    select
        id_client,
        coalesce([2005], 0) as [2005],
        coalesce([2006], 0) as [2006],
        coalesce([2007], 0) as [2007],
        coalesce([2008], 0) as [2008],
        coalesce([2009], 0) as [2009]
    from
    (
    select id_client, year(dt_vente) as an_vente, qte
    from ventes
    ) as vte pivot ( sum(qte) for an_vente in ( [2005], [2006], [2007], [2008], [2009]) ) as pvt;
     
    id_client   2005        2006        2007        2008        2009
    ----------- ----------- ----------- ----------- ----------- -----------
    1           0           1           3           5           7
    2           0           6           4           6           10
    3           0           6           0           0           0
    4           0           0           0           0           4
    5           0           0           0           0           0

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 6
    Par défaut
    Je suis impressionné. Résultat impeccable.

    Je sais que j'abuse.
    En fait, cerise sur mon gâteau, avant de pouvoir utiliser le pivot, je dois travailler par année fiscale et non pas par année calendrier. Donc FY va de 01/07/yy à 30/06/yy+1.
    Est que ce "case" est compatible :
    FY = case
    when month(dt_vente) > 6 then year(dt_vente)+1
    else
    year(dt_vente)
    end
    Encore un grand merci.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui aucun soucis, mettez votre case (vous l'avez bien écrit) à la place de la fonction year, et çelà fonctionnera de la même façon.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 6
    Par défaut
    Merci Waldar

  6. #6
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ca va faire râler les anti-cosmétiques (car celà reste une requête "en dur ..."
    Je ne vois vraiment pas pourquoi tu dis cela ....

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    D'ailleurs ma première réponse est plutôt idiote, le pivot classique fonctionne très bien et lui sera dynamique :
    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
      select id_client,
             coalesce(sum(case when year(dt_vente) = year(dateadd(year, -4, getdate())) then qte end), 0) as an_m4,
             coalesce(sum(case when year(dt_vente) = year(dateadd(year, -3, getdate())) then qte end), 0) as an_m3,
             coalesce(sum(case when year(dt_vente) = year(dateadd(year, -2, getdate())) then qte end), 0) as an_m2,
             coalesce(sum(case when year(dt_vente) = year(dateadd(year, -1, getdate())) then qte end), 0) as an_m1,
             coalesce(sum(case when year(dt_vente) = year(getdate())                    then qte end), 0) as an_m0
        from Ventes
    group by id_client
    order by id_client asc;
     
    id_client   an_m4       an_m3       an_m2       an_m1       an_m0
    ----------- ----------- ----------- ----------- ----------- -----------
    1           0           1           3           5           7
    2           0           6           4           6           10
    3           0           6           0           0           0
    4           0           0           0           0           4
    5           0           0           0           0           0

Discussions similaires

  1. [AC-2003] Jointure sur une seule table
    Par DonKnacki dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/02/2011, 15h06
  2. [MySQL] Plusieurs jointures sur une même table
    Par stephyyr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 14h24
  3. [SQL serveur] [debutant] requette sur une seule table
    Par glanumf dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2006, 15h27
  4. Table de jointure pour une seule table
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/10/2005, 18h49
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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