[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.
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 23 juin 2010 18:27

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

Message 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

CASEWHEN( "Nombre echeances loyer" = '1', 'Annuelle', EMPTY )

Code : Tout sélectionner

CASEWHEN( "Nombre echeances loyer" = '12', 'Mensuelle', EMPTY )

Code : Tout sélectionner

CASEWHEN( "Nombre echeances loyer" = '4', 'Trimestrielle', EMPTY )

Code : Tout sélectionner

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 modification par Mime le 27 juil. 2010 18:59, modifié 1 fois.
OpenOffice 3.2.1 sous Windows XP et sept
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: Structures conditionnelles dans une requête

Message par Pierre-Yves Samyn »

Bonjour

Tu peux utiliser CASE WHEN (en deux mots) qui permet des cas complexes cf. http://user.services.openoffice.org/fr/ ... 822#p35822

La documentation est ici : http://hsqldb.org/doc/2.0/guide/index.html (voir le chapitre 10 pour les fonctions)
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 23 juin 2010 18:27

Re: Structures conditionnelles dans une requête

Message 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

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
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: Structures conditionnelles dans une requête

Message 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

SELECT "Nombre echeances loyer"

CASE
herizo
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 31 mai 2010 15:06

Re: Structures conditionnelles dans une requête

Message 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

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
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 23 juin 2010 18:27

Re: Structures conditionnelles dans une requête

Message 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
Dernière modification par Mime le 27 juil. 2010 17:05, modifié 2 fois.
OpenOffice 3.2.1 sous Windows XP et sept
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: Structures conditionnelles dans une requête

Message 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
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 23 juin 2010 18:27

Re: Structures conditionnelles dans une requête

Message 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.
Pièces jointes
TestLoyer1.odb
(3.67 Kio) Téléchargé 173 fois
OpenOffice 3.2.1 sous Windows XP et sept
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: Structures conditionnelles dans une requête

Message 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

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é 197 fois
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 23 juin 2010 18:27

Re: Structures conditionnelles dans une requête

Message 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. http://user.services.openoffice.org/fr/ ... 822#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
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: Structures conditionnelles dans une requête

Message 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

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

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

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é 244 fois
Avatar de l’utilisateur
Mime
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 23 juin 2010 18:27

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

Message par Mime »

Salut Pierre-Yves Samyn,

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

Merci
OpenOffice 3.2.1 sous Windows XP et sept
Verrouillé