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

Bases de données Delphi Discussion :

SQL CASE WHEN THEN


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 206
    Par défaut SQL CASE WHEN THEN
    Bonjour

    j'ai crée un champ calculé [STOCK] et j'aimerais savoir comment faire pour créer un champs ' Observations' avec la méthode CASE WHEN THEN
    exemple sur ma base : AbsolueDataBase
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    ........
    ......
    sum(E.Qte_e-S.Qte_s) AS Stock
    CASE WHEN STOCK > Seuil THEN 'Suffisant'
    END AS Observations 
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P
    elle déclenche un message d"erreur
    merci pour toutes aide

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    bonjour, outre le fait que ce ne soit pas vraiment une question Delphi, il manque le moteur BDD utilisé et éventuellement le message d'erreur
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 206
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    bonjour, outre le fait que ce ne soit pas vraiment une question Delphi, il manque le moteur BDD utilisé et éventuellement le message d'erreur
    j’utilise Absolute database .abs

    le message d'erreur : [18/11/2021 08:09:02] End of SQL command expected, but 'CASE' found at line 7, column 1 - Native error: 20260

    merci de si vite réponse
    NB : Si c'est possible de transférer le post vers (SGBD SQL)

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    je n'appelle pas ça vraiment une colonne calculée, il s'agit d'un agrégat et cela ne pourra pas fonctionner (en plus il manque un GROUP BY quelque part)

    Si absolutedatabase peut utiliser les CTE cela peut se résoudre en

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    WITH C AS (SELECT
    ........
    ......
    sum(E.Qte_e-S.Qte_s) AS Stock
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P)
    GROUP BY ...... )
     
    SELECT C.*, CASE WHEN C.STOCK > C.Seuil THEN 'Suffisant'
    END AS Observations 
    FROM C

    Sinon un SELECT imbriqué est peut-être possible
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ....,CASE WHEN STOCK > Seuil THEN 'Suffisant'
    END AS Observations  FROM (SELECT ........
    ......
    sum(E.Qte_e-S.Qte_s) AS Stock
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P)
    GROUP BY ......)

  5. #5
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 206
    Par défaut
    Bonjour
    d’après ce que j'ai lit absolutedatabase ne support pas les CTE .
    je vais tester votre SELECT imbriqué

  6. #6
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 206
    Par défaut
    voila ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SELECT T.CDP_P, T.Produits,T.Seuil,
    CASE WHEN STOCK > Seuil THEN 'Suffisant'
    END AS Observations  
    FROM (SELECTT.CDP_P, T.Produits,T.Seuil,
      SUM(E.Qte_e) AS QTE,
      SUM(S.Qte_s) AS QTS,
      sum(E.Qte_e-S.Qte_s) AS Stock
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P
    GROUP BY T.CDP_P, T.Produits,T.Seuil)
    est le message d"erreur ([18/11/2021 08:46:02] End of SQL command expected, but '(' found at line 5, column 6 - Native error: 20260)

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Re,
    Je me suis souvenu qu'effectivement Absolute Database n'est qu'une sorte paradox déguisé, seul avantage pas de BDE à déployer.
    Et donc plus un set de composants qu'un SGBD sensu stricto, la réflexion de Paul tombe donc un peu à l'eau
    Donc, si je devais déplacer le post, ce serait plutôt vers https://www.developpez.net/forums/f1...-sgbd/paradox/ et celui-ci est tellement peu fréquenté que la réponse risque d'être longue !



    Déjà je note une petite erreur ligne 6 FROM (SELECT T.CDP_P, T.Produits,T.Seuil, il manque un espace entre SELECT et T.CDP_P

    j'ai ensuite plusieurs solutions possibles en réserve (surtout maintenant que le SQL est plus complet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T.CDP_P, T.Produits,T.Seuil,
      SUM(E.Qte_e) AS QTE,
      SUM(S.Qte_s) AS QTS,
      sum(E.Qte_e-S.Qte_s) AS Stock,
      CASE WHEN  sum(E.Qte_e-S.Qte_s)>T.SEUIL THEN 'Suffisant' END OBSERVATIONS
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P
    GROUP BY T.CDP_P, T.Produits,T.Seuil

    - Comme on le faisait avec Paradox, l'utilisation d'un fichier .SQL (au même endroit que les tables) ce qui devient un équivalent CTE
    Citation Envoyé par requete.sql
    SELECT T.CDP_P, T.Produits,T.Seuil,
    SUM(E.Qte_e) AS QTE,
    SUM(S.Qte_s) AS QTS,
    sum(E.Qte_e-S.Qte_s) AS Stock
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P
    GROUP BY T.CDP_P, T.Produits,T.Seuil
    et une requête du genre (* il faut peut-être mettre le nom du fichier SQL entre guillemets)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CDP_P,Produits,Seuil,qte,qts,stock,case WHEN Stock>Seuil then 'suffisant' END Observations FROM requete.SQL

    - l'utilisation d'une UNION (plus long car deux requêtes sur les tables)
    Code SQL : 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
     
    SELECT T.CDP_P, T.Produits,T.Seuil,
      SUM(E.Qte_e) AS QTE,
      SUM(S.Qte_s) AS QTS,
      sum(E.Qte_e-S.Qte_s) AS Stock,
      MAX('suffisant') OBSERVATIONS 
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P
    GROUP BY T.CDP_P, T.Produits,T.Seuil
    HAVING sum(E.Qte_e-S.Qte_s)>T.SEUIL 
    UNION
    SELECT T.CDP_P, T.Produits,T.Seuil,
      SUM(E.Qte_e) AS QTE,
      SUM(S.Qte_s) AS QTS,
      sum(E.Qte_e-S.Qte_s) AS Stock,
      MAX('')
    FROM TProduits T
    LEFT JOIN TEntrees E ON E.CD_PE = T.CDP_P
    LEFT JOIN Tsorties S ON S.CD_PS = T.CDP_P
    GROUP BY T.CDP_P, T.Produits,T.Seuil
    HAVING sum(E.Qte_e-S.Qte_s)<=T.SEUIL

    Enfin, j'ai encore quelques reserves niveau des agregats, quid si il n'y a pas de mouvements d'entrées ou de sorties (donc QTE_E=NULL ou QTE_S=NULL) ?
    Avec d'autres SGBD j'utiliserai un COALESCE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T.CDP_P, T.Produits,T.Seuil,
      SUM(COALESCE(E.Qte_e,0)) AS QTE,
      SUM(COALESCE(S.Qte_s,0)) AS QTS,
      sum(COALESCE(E.Qte_e,0) - COALESCE(S.Qte_s,0)) AS Stock,
    ....

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par MIWAN Voir le message
    j’utilise Absolute database .abs
    Si c'est possible de transférer le post vers (SGBD SQL)
    Je pourrai le faire bien entendu mais je ne suis pas sûr que cela serait "malin", Absolute Database n'a pas de forum spécifique et le forum https://www.developpez.net/forums/f3...s/langage-sql/ est très/trop généraliste

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

Discussions similaires

  1. Requête SQL CASE WHEN THEN ESLE
    Par jessyd dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/05/2018, 17h22
  2. SQL Case When
    Par mechatikhaled dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/01/2009, 16h57
  3. Sql CASE/WHEN avec HyperFile
    Par iniaina dans le forum HyperFileSQL
    Réponses: 5
    Dernier message: 21/11/2008, 10h37
  4. Transact SQL : case when
    Par dianouch dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/07/2006, 12h12
  5. Equivalent "Select Case when then else end" sur Paradoxe
    Par Seuh.m dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/06/2006, 08h23

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