[Résolu] Structures conditionnelles dans une requête

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur: Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.

[Résolu] Structures conditionnelles dans une requête

Messagepar Mime » 27 Juil 2010 10:33

Salut à tous,

Je souhaiterais faire une requête permettant de préciser si un type de paiement est "mensuel", "semestriel", "trimestriel" ou "annuel", en fonction d'un nombre d'échéance(s).

Pour cela, j'ai essayé d'utiliser le fameux CASEWHEN. Seul problème, je n'arrive pas à faire vérifier toutes les conditions en même temps. Ceci est certainement du au fait que je n'utilise pas la bonne formule, ou alors que je l'utilise mal. Voici donc de quelle manière je m'y prend pour avoir un résultat:

Code : Tout sélectionner   AgrandirRéduire
CASEWHEN( "Nombre echeances loyer" = '1', 'Annuelle', EMPTY )

Code : Tout sélectionner   AgrandirRéduire
CASEWHEN( "Nombre echeances loyer" = '12', 'Mensuelle', EMPTY )

Code : Tout sélectionner   AgrandirRéduire
CASEWHEN( "Nombre echeances loyer" = '4', 'Trimestrielle', EMPTY )

Code : Tout sélectionner   AgrandirRéduire
CASEWHEN( "Nombre echeances loyer" = '2', 'Semestrielle', EMPTY )


Tout cela fonctionne très bien, mais le résultat s'affiche sur plusieurs colonnes, alors que je voudrais que le résultat s'affiche dans une seule colonne.
J'ai essayer de séparer chaque "CASEWHEN" par un point virgule dans une même colonne, sans succès.
Peut être existe t il un moyen de regrouper des "Alias" (je n'ai pas trouvé), ou encore une alternative au CASEWHEN. Je pense à un genre de Si ..., Sinon si ... , Sinon si ... ou alors un CASE 1, CASE 2, CASE 3 ... mais je n'ai pas trouvé de doc la dessus.

Si vous avez une ou plusieurs solutions. Je serais également heureux d'avoir de la documentation sur l'ensemble des fonctions possible dans une requête OpenOffice.

Merci d'avance pour vos réponses.
Dernière édition par Mime le 27 Juil 2010 17:59, édité 1 fois.
OpenOffice 3.2.1 sous Windows XP et sept
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 24
Inscrit le : 23 Juin 2010 17:27

Re: Structures conditionnelles dans une requête

Messagepar Pierre-Yves Samyn » 27 Juil 2010 10:51

Bonjour

Tu peux utiliser CASE WHEN (en deux mots) qui permet des cas complexes cf. viewtopic.php?p=35822#p35822

La documentation est ici : http://hsqldb.org/doc/2.0/guide/index.html (voir le chapitre 10 pour les fonctions)
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: Structures conditionnelles dans une requête

Messagepar Mime » 27 Juil 2010 15:06

Salut Pierre-Yves Samyn,

En m'inspirant des ressources que tu m'as fourni voici la requête SQL que j'ai créé :

Code : Tout sélectionner   AgrandirRéduire
SELECT "Nombre echeances loyer"

CASE
WHEN "Nombre echeances loyer" = '1' THEN 'Annuelle'

ELSE
CASE
WHEN ("Nombre echeances loyer" = '2')THEN 'Semestrielle'
END

ELSE
CASE
WHEN ("Nombre echeances loyer" = '4')THEN 'Trimestrielle'
END

ELSE
CASE
WHEN ("Nombre echeances loyer" = '12')THEN 'Mensuelle'
END

END as "Echeance"

from "Contrat"


Moi je la trouve plutôt bonne, mais mon PC n'est pas du même avis puisque lors de l'exécution il me met :


Impossible de charger le contenu des données.
Statut SQL: 37000
Code d'erreur: -11

Unexpected token CASE, requires FROM in statement [SELECT "Nombre echeances loyer"

CASE
WHEN "Nombre echeances loyer" = '1' THEN 'Annuelle'


ELSE
CASE
WHEN ("Nombre echeances loyer" = '2')THEN 'Semestrielle'
END


ELSE
CASE
WHEN ("Nombre echeances loyer" = '4')THEN 'Trimestrielle'
END


ELSE
CASE
WHEN ("Nombre echeances loyer" = '12')THEN 'Mensuelle'
END

END as "Echeance"

from "Contrat"]


Je continu à chercher une explication, en attendant une réponse.
Merci.
OpenOffice 3.2.1 sous Windows XP et sept
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 24
Inscrit le : 23 Juin 2010 17:27

Re: Structures conditionnelles dans une requête

Messagepar Pierre-Yves Samyn » 27 Juil 2010 15:29

Avec la base pour tester ce serait plus facile mais bon... a priori il manque déjà une virgule avant CASE (si j'ai bien compris tu veux une colonne "Nombre echeances loyer" puis une autre calculée...) :

Code : Tout sélectionner   AgrandirRéduire
SELECT "Nombre echeances loyer"

CASE
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: Structures conditionnelles dans une requête

Messagepar herizo » 27 Juil 2010 15:34

Bonjour,

Moi je la trouve plutôt bonne, mais mon PC n'est pas du même avis
hohoho
Essaies un switch case de ce type : (en tout cas, cette syntaxe marche si tu utilises la requête dans une macro, ce que j'ignore un peu)

Code : Tout sélectionner   AgrandirRéduire
Select Case "Nombre echeances loyer"
   Case 1 :
      tonString = "Semestrielle"
   Case 2 :
      tonString = "Trimestrielle"
   Case 4 :
      tonString = "Mensuelle"
   Case 12 :
      tonString = "Annuelle"
end select
OpenOffice.org 3.1 Windows XP Professionnal
herizo
Membre lOOyal
Membre lOOyal
 
Message(s) : 31
Inscrit le : 31 Mai 2010 14:06

Re: Structures conditionnelles dans une requête

Messagepar Mime » 27 Juil 2010 15:41

Re Pierre-Yves Samyn,

Si j'ai bien compris tu veux une colonne "Nombre echeances loyer" puis une autre calculée...


C'est bien ca.

Avec la base pour tester ce serait plus facile mais bon


Je vais préparer une base exemple.

Merci
Dernière édition par Mime le 27 Juil 2010 16:05, édité 2 fois.
OpenOffice 3.2.1 sous Windows XP et sept
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 24
Inscrit le : 23 Juin 2010 17:27

Re: Structures conditionnelles dans une requête

Messagepar Pierre-Yves Samyn » 27 Juil 2010 15:51

Mime a écrit:Je vais préparer une base exemple.


Euh... as-tu testé l'ajout de la virgule ? :)

herizo a écrit:Essaies un switch case de ce type : (en tout cas, cette syntaxe marche si tu utilises la requête dans une macro, ce que j'ignore un peu)


Non, il s'agit là d'une syntaxe basic et non d'une syntaxe HSQL
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: Structures conditionnelles dans une requête

Messagepar Mime » 27 Juil 2010 16:01

Bonjour herizo,

Essaies un switch case de ce type : (en tout cas, cette syntaxe marche si tu utilises la requête dans une macro, ce que j'ignore un peu)


Non je n'utilise pas de macro pour le moment, mais ton code pourra m'être utile pour une autre fois peut être.

Pierre-Yves Samyn a écrit:Euh... as-tu testé l'ajout de la virgule ? :)


J'ai essayé mais rien de plus. Du coup j'en ai pris compte dans mon exemple.
Pièces jointes
TestLoyer1.odb
(3.67 Kio) Téléchargé 81 fois
OpenOffice 3.2.1 sous Windows XP et sept
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 24
Inscrit le : 23 Juin 2010 17:27

Re: Structures conditionnelles dans une requête

Messagepar Pierre-Yves Samyn » 27 Juil 2010 16:24

Oui... il n'y avait pas que la virgule... L'expression testée figure après le CASE et la valeur testée après le WHEN :

Code : Tout sélectionner   AgrandirRéduire
SELECT "Nombre echeances loyer",

CASE "Nombre echeances loyer"
WHEN  '1' THEN 'Annuelle'
ELSE
   CASE "Nombre echeances loyer"
   WHEN '2'THEN 'Semestrielle'
   ELSE
      CASE "Nombre echeances loyer"
      WHEN '4'THEN 'Trimestrielle'
      ELSE
         CASE "Nombre echeances loyer"
         WHEN '12' THEN 'Mensuelle'   
         END
      END
   END
END AS "Echeance"

FROM "Contrat"
Pièces jointes
TestLoyer1.odb
(3.63 Kio) Téléchargé 97 fois
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: Structures conditionnelles dans une requête

Messagepar Mime » 27 Juil 2010 17:11

Pierre-Yves Samyn a écrit:Oui... il n'y avait pas que la virgule... L'expression testée figure après le CASE et la valeur testée après le WHEN


Ok, effectivement ca marche beaucoup mieux comme ca :D . Ce que je ne comprend pas, c'est pourquoi, dans ton exemple ce n'est pas déclaré de la même manière.

Pierre-Yves Samyn a écrit:Tu peux utiliser CASE WHEN (en deux mots) qui permet des cas complexes cf. viewtopic.php?p=35822#p35822


Peux tu m'en donner la raison ?

Dernière question, est ce que je pourrais me servir de cette requête en mode ébauche de requête ? Car avant de vous consulter j'avais commence avec cet outil.

Sinon merci pour le coup de main, maintenant j'ai bien compris le truc. Ca va me service pour la suite de mon développement, ou plusieurs cas similaire devrons être traités.
OpenOffice 3.2.1 sous Windows XP et sept
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 24
Inscrit le : 23 Juin 2010 17:27

Re: Structures conditionnelles dans une requête

Messagepar Pierre-Yves Samyn » 28 Juil 2010 08:10

Mime a écrit:Ok, effectivement ca marche beaucoup mieux comme ca :D . Ce que je ne comprend pas, c'est pourquoi, dans ton exemple ce n'est pas déclaré de la même manière.


Cette syntaxe est également correcte (cf. la documentation) mais dans ton cas la position des "END" était incorrecte. Il faut :

Code : Tout sélectionner   AgrandirRéduire
SELECT "Nombre echeances loyer",

CASE
   WHEN "Nombre echeances loyer" = '1'
   THEN 'Annuelle'
   ELSE
      CASE
      WHEN "Nombre echeances loyer" = '2'
      THEN 'Semestrielle'
      ELSE
         CASE
      WHEN "Nombre echeances loyer" = '4'
      THEN 'Trimestrielle'
      ELSE
         CASE
         WHEN "Nombre echeances loyer" = '12'
         THEN 'Mensuelle'   
         END
      END
   END
END AS "Echeance"

FROM "Contrat"


Je reviens sur ma proposition précédente, fonctionnelle mais, mal bâtie... Je suis reparti de ton exemple mais en fait il est possible de simplifier :

Code : Tout sélectionner   AgrandirRéduire
SELECT "Nombre echeances loyer",

CASE "Nombre echeances loyer"
WHEN  '1' THEN 'Annuelle'
WHEN '2'THEN 'Semestrielle'
WHEN '4'THEN 'Trimestrielle'
WHEN '12' THEN 'Mensuelle'   
END AS "Echeance"

FROM "Contrat"


Cela dit :

Mime a écrit:Dernière question, est ce que je pourrais me servir de cette requête en mode ébauche de requête ? Car avant de vous consulter j'avais commence avec cet outil.


Les syntaxes précédentes ne permettent pas de travailler en mode ébauche. Je t'en propose donc une nouvelle qui le permet :

Code : Tout sélectionner   AgrandirRéduire
SELECT "Nombre echeances loyer", CASEWHEN( "Nombre echeances loyer" = '1', 'Annuelle', CASEWHEN( "Nombre echeances loyer" = '2', 'Semestrielle', CASEWHEN( "Nombre echeances loyer" = '4', 'Trimestrielle', CASEWHEN( "Nombre echeances loyer" = '12', 'Mensuelle', 'Autre' ) ) ) ) AS "Echeance" FROM "Contrat"


La base jointe comprend ces 4 possibilités
Pièces jointes
TestLoyer1.odb
(3.67 Kio) Téléchargé 147 fois
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: [Résolu] Structures conditionnelles dans une requête

Messagepar Mime » 28 Juil 2010 16:35

Salut Pierre-Yves Samyn,

Super compète ta réponse :super:.

Merci
OpenOffice 3.2.1 sous Windows XP et sept
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 24
Inscrit le : 23 Juin 2010 17:27


Retour vers Base de données

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 0 invité(s)