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 :

Créer un KPI sur 30 jours "roulants"


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2024
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Créer un KPI sur 30 jours "roulants"
    Bonjour
    (Premier post sur le forum, pardonnez moi si je rate qqc)

    J'ai un KPI "On time delivery ou OTD" qui se calcule comme suit : Parmi les X orders qui devaient etre livrées à telle date, combien ont été livrées dans les temps (<= ETA delivery)

    Probleme: Je sais calculer l'OTD sur une période de temps (disons tous les jours, tous les mois), mais je cherche a obtenir cet OTD sur une période de 30 jours roulants et ce tous jours.

    ex (jour au hasard en 2023): 10-06-2023 / OTD = Nb commandes qui devaient etre livrées entre du 11-05-2023 et le 09-06-2023 et bien été livées à temps


    --------
    La query qui me donne le KPI tous les jours (mais pas roulant sur la somme des 30J dans le passé) que j'essaye d'améliorer
    (Il y a aussi une metric d'on time shipment dans la query que je n'ai pas retirée, mais l'idée est la meme)

    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 
      SELLER_ID
      ,SELLER_NAME
      ,DATE(DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME) AS DATE_DELIVERY_ETA
      ,COUNT(DISTINCT(ORDER_ID)) AS NB_ORDERS
      ,COUNT(DISTINCT(CASE WHEN SHIPPED_ON_TIME = 1 THEN ORDER_ID END)) AS NB_ORDERS_OTS
      ,ROUND(SAFE_DIVIDE(COUNT(DISTINCT(CASE WHEN SHIPPED_ON_TIME = 1 THEN ORDER_ID END)),COUNT(DISTINCT(ORDER_ID))), 4) AS OTS
      ,COUNT(DISTINCT(CASE WHEN DELIVERED_ON_TIME = 1 THEN ORDER_ID END)) AS NB_ORDERS_OTD
      ,ROUND(SAFE_DIVIDE(COUNT(DISTINCT(CASE WHEN DELIVERED_ON_TIME = 1 THEN ORDER_ID END)),COUNT(DISTINCT(ORDER_ID))), 4) AS OTD
    FROM `universe-prod-20220914.shipping.universe_delivery_forwards`
    WHERE 1=1
      AND SELLER_ID = '1EU' -- Filter on specific sellers
      AND DATE(DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME) >= CURRENT_DATE()-365 -- Date start
      AND DATE(DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME) < CURRENT_DATE() -- Date end - maximum current date (exclude orders to be delivered after today)
    GROUP BY 1,2,3
    ORDER BY 1,3 DESC
    Champs comportés par ma table en pj
    DATETIME_CREATION_ORDER
    DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME
    DATETIME_DELIVERY_ORDER
    DATETIME_SHIPPING_ORDER
    DATETIME_SHIPPING_ORDER_ESTIMATED_LOCAL TIME
    DELIVERED_ON_TIME
    SHIPPED

    J'utilise Google cloud / Big Query

    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 150
    Points : 1 935
    Points
    1 935
    Par défaut
    Bonjour,

    Tu peux utiliser les fonctions analytiques COUNT(...) OVER (...) ou SUM(...) OVER (...) pour faire des comptages glissants. Si tu fournis un petit jeu de données on pourrait illustrer.

    Merci

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2024
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci !
    Voici un exemple de data dans la table utilisée Cas data OTD.xlsx
    Fichiers attachés Fichiers attachés

  4. #4
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Points : 2
    Points
    2
    Par défaut jean-j
    bonjour,

    il suffit d'encadrer DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME par trunc(sysdate)-30 et sysdate

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND DATE(DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME) >= trunc(sysdate)-30 
      AND DATE(DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME) <  trunc(sysdate)

    escusez moi si la réponse n'est pas juste
    cordialement

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 405
    Points
    28 405
    Par défaut
    @LEGALLJA:
    TRUNC pas plus que SYSDATE ne sont des fonctions du langage SQL normalisé.
    Sur tout autre SGBD que celui que vous connaissez, cette formulation conduira à une erreur de syntaxe.
    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.

  6. #6
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Points : 2
    Points
    2
    Par défaut correctif
    bonjour,

    Avec CURRENT_DATE c'est plus correct

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND DATE(DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME) >= CURRENT_DATE -30 
    AND DATE(DATETIME_DELIVERY_ORDER_ESTIMATED_LOCAL_TIME) <  CURRENT_DATE

    cordialement

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 776
    Points : 1 488
    Points
    1 488
    Par défaut
    Citation Envoyé par rguillau Voir le message
    ex (jour au hasard en 2023): 10-06-2023 / OTD = Nb commandes qui devaient etre livrées entre du 11-05-2023 et le 09-06-2023 et bien été livées à temps
    Je ne comprends pas pourquoi "les 30 derniers jours glissants" ne prennent pas en compte le jour J.
    C'est peut être plus "exact" dans le sens où les valeurs seront les mêmes toute la journée mais, sémantiquement, je m'attends à ce que les résultats du jour J soient comptabilisés.
    Donc je suppose que vous avez un compteur à part pour le jour J.

    Ensuite, la date de référence est un élément crucial :
    Si c'est la même pour tous les livreurs, comme la date du jour (ou un scalaire contenu dans une variable), alors une simple condition WHERE avec un calcul de date pour soustraire les fameux 30 jours (CURRENT_DATE()-30) et l'affaire est réglée

    Si la période est variable par livreur, là c'est plus complexe !
    Exemple de demande : "Pour chaque livreur sur ces x derniers jours calendaires à partir de sa dernière journée d'activité, sachant que 1<x<30. Afficher le nombre de jours de la période considérée, le nombre de commandes confiées et le nombre de commandes livrées à temps".
    Autre exemple : "Pour chaque livreur, sur les 30 derniers jours d'activité effectifs, afficher le nombre de commandes confiées et le nombre de commande livrées à temps. Note : les livreurs n'ayant pas 30 jours d'activité auront null comme décompte".
    Je rejoins vanagreg dans le fait qu'on ait a utiliser des fonctions analytiques. https://cloud.google.com/bigquery/do...function-calls


    Peut tu expliciter la demande ?
    Le savoir est une nourriture qui exige des efforts.

Discussions similaires

  1. Requête pour les rappel sur 5 jour
    Par Mbrillon dans le forum Oracle
    Réponses: 16
    Dernier message: 06/05/2007, 14h01
  2. question sur 6 jours ouvrés par mois de préavis du syntec
    Par Filippo dans le forum Droit du travail
    Réponses: 21
    Dernier message: 14/06/2006, 13h20
  3. [Oracle] Date(oracle) => Année saisie sur 4 jours, retournée sur 2
    Par romulus dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/03/2006, 03h14
  4. [VB.Net] Calendar et style sur les jours
    Par Sardonnen dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/11/2005, 10h23
  5. [Log4j] journalisation sur 15 jours
    Par lapartdombre dans le forum Logging
    Réponses: 10
    Dernier message: 29/09/2005, 13h42

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