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

Langage SQL Discussion :

Analyse de type MTD/YTD


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 77
    Points : 75
    Points
    75
    Par défaut Analyse de type MTD/YTD
    Bonjour à tous,

    A partir d'une table stockant les données statistiques de ventes, mois par mois, serait il possible de synthètiser ces données :
    - à partir de parmètres de type AA et MM
    - puis de générer 4 colonnes calculées MTD n-1; MTD n; YTD n-1; YTD n selon la règle :

    Si AA=n et MM=m, alors MTD n et YTD n = CA
    Si AA=n-1 et MM=m, alors MTD n-1 et YTD n-1 = CA
    Si AA=n et MM<m, alors MTD n =0 et YTD n = CA
    Si AA=n-1 et MM<m, alors MTD n-1 =0 et YTD n-1 = CA
    Si AA=n et MM>m, alors MTD n =0 et YTD n = 0
    Si AA=n-1 et MM>m, alors MTD n-1 =0 et YTD n-1 = 0
    que je pourrais ensuite sommer par un group by, pour un client, une famille clients ...

    En espérant avoir été clair dans l'énoncé,

    Merci d'avance de votre aide,

    Philippe

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 763
    Points
    30 763
    Par défaut
    Citation Envoyé par berapard Voir le message
    En espérant avoir été clair dans l'énoncé,
    Pas vraiment.

    As-tu lu les Règles du forum Langage SQL à lire par tous ?
    La structure des tables, quelques données, un exemple du résultat attendu ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 77
    Points : 75
    Points
    75
    Par défaut
    Je vais donc essayer de reprendre, en essayant d'être à peu près dans les clous et en précisant que j'utilise Open Executive 4, outil BI de Cegid.

    Le bout de code suivant :

    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
    SELECT TOP 100
    	[STE]
    	,[CODE_CLT]
    	,[FAM_CLT]
    	,[ANNEE]
    	,[MOIS]
    	,[QTE_FAC]
    	,[QTE_SUP]
    	,[QTE_ACC]
    	,[MONTANT_HT]
     
    FROM
    	[dbo].[STAT_MARQUES_CLIENTS]
     
    where
    	[ANNEE] in (!PARAM_ANNEE, !PARAM_ANNEE-1)
    	and [MOIS] <= !PARAM_MOIS
    	and CODE_CLT in ('C0000002','C0000009')
    donnerait le résultat suivant, avec comme valeur de paramétre :
    PARAM_ANNEE=2009
    PARAM_MOIS=3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    STE	CODE_CLT	FAM_CLT	ANNEE	MOIS	QTE_FAC	QTE_SUP	QTE_ACC	MONTANT_HT
    ---	--------	--------	--------	--------	--------	--------	--------	--------
    BRU	C0000002	FLO	2008	1	1	0	27	42
    BRU	C0000002	FLO	2008	1	0	0	2	0
    BRU	C0000003	FLO	2008	1	14	0	0	253,8
    BRU	C0000002	FLO	2009	1	1	0	0	6,5
    BRU	C0000003	FLO	2008	3	1	0	0	6,5
    BRU	C0000002	FLO	2009	3	2	0	0	72
    BRU	C0000002	FLO	2009	3	2	0	0	72
    BRU	C0000002	FLO	2009	3	4	0	0	93,6
    BRU	C0000003	FLO	2009	3	0	0	10	0
    BRU	C0000002	FLO	2009	3	6	0	0	232,2
    et voici le résultat auquel j'aspire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    STE	CODE_CLT	MTD n-1	MTD n	YTD n-1	YTD n
    ---	--------	--------	--------	--------	--------
    BRU	C0000003	6,5	0	260,3	0
    BRU	C0000002	0	469,8	42	476,3
    Merci d'avance

    Philippe

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 763
    Points
    30 763
    Par défaut
    Un cas typique de Cosmétique...
    Quant aux explications... je suppose que MTDn est le total du mois en cours et YTDn est la somme des mois depuis le début de l'année. Ai-je bien compris ?
    Si tu utilises un outil BI évolué, ce sont des fonctions qu'il saura prendre en charge.

    Par ailleurs tu n'as pas précisé le SGBD que tu utilisais.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 77
    Points : 75
    Points
    75
    Par défaut
    Un cas typique de Cosmétique...?
    Je ne suis ni informaticien, ni commercial ... mais financier et trouve que cette "comestique" peut avoir son intérêt ...

    Quant aux explications... je suppose que MTDn est le total du mois en cours et YTDn est la somme des mois depuis le début de l'année. Ai-je bien compris ?
    Effectivement, Month To Date ou Year to Date (ou Mois Isolé et Cumul Annuel en fançais dans le texte) où n est l'année en cours et n-1 l'année précédente

    Si tu utilises un outil BI évolué, ce sont des fonctions qu'il saura prendre en charge..
    Malheureusement, l'outil que j'utilise (OpenExecutive 4.2) ne permet pas de le faire simplement : il faudrait intervenir mensuellement pour créer par une transformation ces 4 colonnes calculées, qui dépendent de la date à laquelle on se place.

    Par ailleurs tu n'as pas précisé le SGBD que tu utilisais.
    SQL7.00961

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 763
    Points
    30 763
    Par défaut
    Une requête qui ressemblerait à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  ste
        ,   code_clt
        ,   SUM(CASE WHEN annee = !param_annee AND mois = !param_mois THEN montant_ht ELSE 0 END)   AS mtd_n
        ,   SUM(CASE WHEN annee = !param_annee_1 AND mois = !param_mois THEN montant_ht ELSE 0 END) AS mtd_n_1
        ,   SUM(CASE WHEN annee = !param_annee THEN montant_ht ELSE 0 END)  AS ytd_n
        ,   SUM(CASE WHEN annee = !param_annee_1 THEN montant_ht ELSE 0 END)    AS ytd_n_1
    FROM    dbo.stat_marques_clients
    WHERE   annee IN (!param_annee, !param_annee_1)
        AND mois <= !param_mois
        AND code_clt IN ('c0000002', 'c0000009')
    GROUP BY ste
        ,   code_clt
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 77
    Points : 75
    Points
    75
    Par défaut
    Après mon dernier post, je me suis immédiatement empressé de faire ce qu'il ne faut pas faire, et je suis arrivé à une requête opérationnelle :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    SELECT
    	S.[STE]
    	,S.[CODE_CLT]
    	,S.[NOM_CLT]
    	,SUM(S.CA_YTDn) as CA_YTDn
    	,SUM(S.CA_YTDn_1) as CA_YTDn_1
    	,SUM(S.CA_MTDn) as CA_MTDn
    	,SUM(S.CA_MTDn_1) as CA_MTDn_1
     
    FROM
    	(
    	Select
    		[STE]
    		,[CODE_CLT]
    		,[NOM_CLT]
    		,SUM([MONTANT_HT]) as CA_YTDn
    		,0 as CA_YTDn_1
    		,SUM([MONTANT_HT]) as CA_MTDn
    		,0 as CA_MTDn_1
    	from[dbo].[STAT_MARQUES_CLIENTS]
    	where ([ANNEE] = !PARAM_ANNEE and [MOIS] = !PARAM_MOIS)
     
    	group by
    	[STE]
    	,[CODE_CLT]
    	,[NOM_CLT]
     
    	union
     
    	Select
    		[STE]
    		,[CODE_CLT]
    		,[NOM_CLT]
    		,0 as CA_YTDn
    		,SUM([MONTANT_HT]) as CA_YTDn_1
    		,0 as CA_MTDn
    		,SUM([MONTANT_HT]) as CA_MTDn_1
    	from[dbo].[STAT_MARQUES_CLIENTS]
    	where ([ANNEE] = !PARAM_ANNEE-1 and [MOIS] = !PARAM_MOIS)
     
    	group by
    	[STE]
    	,[CODE_CLT]
    	,[NOM_CLT]
     
    	union
     
    	Select
    		[STE]
    		,[CODE_CLT]
    		,[NOM_CLT]
    		,SUM([MONTANT_HT]) as CA_YTDn
    		,0 as CA_YTDn_1
    		,0 as CA_MTDn
    		,0 as CA_MTDn_1
    	from[dbo].[STAT_MARQUES_CLIENTS]
    	where ([ANNEE] = !PARAM_ANNEE and [MOIS] < !PARAM_MOIS)
     
    	group by
    	[STE]
    	,[CODE_CLT]
    	,[NOM_CLT]	
     
    	union
     
    	Select
    		[STE]
    		,[CODE_CLT]
    		,[NOM_CLT]
    		,0 as CA_YTDn
    		,SUM([MONTANT_HT]) as CA_YTDn_1
    		,0 as CA_MTDn
    		,0 as CA_MTDn_1
    	from[dbo].[STAT_MARQUES_CLIENTS]
    	where ([ANNEE] = !PARAM_ANNEE-1 and [MOIS] < !PARAM_MOIS)
     
    	group by
    	[STE]
    	,[CODE_CLT]
    	,[NOM_CLT]
     
    	) as S
     
    where
    	S.CODE_CLT in ('C0000002','C0000009')
     
     
    Group by
    	S.[STE]
    	,S.[CODE_CLT]
    	,S.[NOM_CLT]
     
    Order by
    	S.[STE]
    	,S.[CODE_CLT]
    	,S.[NOM_CLT]
    Mais comme tu le vois, d'une compléxité sans commune mesure avec celle que tu me proposes, que je viens de tester avec succès, et dont je vais sans aucun doute me servir très régulièrement !

    Grand merci pour ton aide et bonne soirée,

    Philippe

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

Discussions similaires

  1. Analyser puis déterminer les types de champ idéal
    Par Sparktacus dans le forum Outils
    Réponses: 3
    Dernier message: 05/02/2013, 18h05
  2. [Java5] Types énumérés et analyse syntaxique
    Par vaxyl dans le forum Langage
    Réponses: 7
    Dernier message: 28/08/2012, 11h33
  3. [AC-2007] Rapport croissance commandes en YTD ou MTD
    Par dudumomo dans le forum IHM
    Réponses: 6
    Dernier message: 13/03/2012, 10h33
  4. Réponses: 2
    Dernier message: 23/05/2011, 01h27
  5. L'analyse semantique de questions de type Pourquoi
    Par stentorus dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 13/03/2010, 11h28

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