Page 1 sur 1

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

MessagePublié: 27 Juil 2010 10:33
par Mime
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.

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 10:51
par Pierre-Yves Samyn
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)

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 15:06
par Mime
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.

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 15:29
par Pierre-Yves Samyn
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

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 15:34
par herizo
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

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 15:41
par Mime
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

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 15:51
par Pierre-Yves Samyn
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

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 16:01
par Mime
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.

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 16:24
par Pierre-Yves Samyn
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"

Re: Structures conditionnelles dans une requête

MessagePublié: 27 Juil 2010 17:11
par Mime
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.

Re: Structures conditionnelles dans une requête

MessagePublié: 28 Juil 2010 08:10
par Pierre-Yves Samyn
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

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

MessagePublié: 28 Juil 2010 16:35
par Mime
Salut Pierre-Yves Samyn,

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

Merci