Probleme CASE THEN

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Probleme CASE THEN

par Patriboom » 02 févr. 2008, 01:15

Voici enfin qui fonctionne:

Code : Tout sélectionner

ELECT * FROM ( SELECT Dte_Jour, Details, Dte_Mois, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois = 6 ) AS Annee_calculee HAVING Annee_calculee = 2008 LIMIT 0 , 30
Il faut donc choisir les colonnes dans la sous-requête.

Cette version peut aussi donner de bons résultats.

Code : Tout sélectionner

SELECT Dte_jour, Annee_calculee, Details FROM ( SELECT Dte_Jour, Details, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1 ) AS Banane WHERE Annee_calculee = 2008 LIMIT 0 , 30
, mais la répétition des champs m'épuise :!: lorsqu'inutile. J'avoue que tout ce bataclan, inclus dans une requête comprenant un JOIN, nécessiterait vraisemblablement une répétition des champs.


Merci à toi, patient éléphant (Berzemus).






La structure n'a pas changé depuis le premier message, voici des données réelles.

Code : Tout sélectionner

CREATE TABLE `paroisses_feries` ( `id_ferie` int(11) NOT NULL auto_increment, `id_paroisse` int(11) NOT NULL, `Dte_Jour` int(11) NOT NULL, `Dte_Mois` int(11) NOT NULL, `Dte_Annee` int(11) NOT NULL, `ferie_type` enum('Une fois','Annuel','Special') NOT NULL, `Titre` varchar(10) NOT NULL, `Details` varchar(50) NOT NULL, PRIMARY KEY (`id_ferie`), KEY `Calendrier` (`Dte_Mois`,`Dte_Jour`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Le calendrier des fêtes paroissiales et religieuses' AUTO_INCREMENT=190 ; -- -- Contenu de la table `paroisses_feries` -- INSERT INTO `paroisses_feries` (`id_ferie`, `id_paroisse`, `Dte_Jour`, `Dte_Mois`, `Dte_Annee`, `ferie_type`, `Titre`, `Details`) VALUES (1, 1, 25, 8, 2008, 'Annuel', 'Assomption', 'Fête patronale de l`Assomption'), (2, 1, 24, 6, 2008, 'Annuel', 'St-Jean', 'Saint-Jean Baptiste'), (3, 1, 25, 12, 2008, 'Annuel', 'Noël', 'La Nativité de notre Seigneur Jésus'), (4, 1, 1, 1, 2008, 'Annuel', 'Nouvel An', 'Nouvelle année'), (5, 1, 2, 11, 2007, 'Annuel', 'Fête morts', 'Commémoration des fidèles défunts'), (7, 1, 15, 4, 1990, 'Une fois', 'Pâques', 'La Résurrection de notre Seigneur');

par Berzemus » 02 févr. 2008, 00:27

Pour donner un résultat qui marche pour sur, il faudrait la table, et les données.. :roll:

par Patriboom » 01 févr. 2008, 20:58

La requête suivante ne donne plus d'erreur:

Code : Tout sélectionner

SELECT Dte_jour, Annee_calculee FROM ( SELECT Dte_Jour, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1 ) AS Annee_calculee WHERE Annee_calculee = 2008 LIMIT 0 , 30
... mais ne donne pas de résultat non plus!



Même chose si je change l'allias:

Code : Tout sélectionner

SELECT Dte_jour, Annee_calculee FROM ( SELECT Dte_Jour, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1 ) AS Banane WHERE Annee_calculee = 2008 LIMIT 0 , 30
Mêmes remarques pour Having écrit ainsi:

Code : Tout sélectionner

SELECT Dte_jour, Annee_calculee FROM ( SELECT Dte_Jour, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1 ) AS Annee_calculee HAVING Annee_calculee = 2008 LIMIT 0 , 30

Pourtant, j'ai des données qui devraient sortir pour deux raisons (Annuel et 2008) ou au moins pour une raison:

id_ferie | id_paroisse | Dte_Jour | Dte_Mois | Dte_Annee | ferie_type
1 | 1 | 25 | 8 | 2008 | Annuel
2 | 1 | 24 | 6 | 2008 | Annuel

3 | 1 | 8 | 2 | 2008 | Une fois
5 | 1 | 2 | 11 | 2007 | Annuel

Alors que je m'attends à ce que l'enregistrement suivant soit laissé de côté:
4 | 1 | 12 | 9 | 2007 | Une fois


Pour l'instant: rien ne sort


J'ai aussi tenté cette forme:

Code : Tout sélectionner

SELECT * FROM ( SELECT Dte_Jour,Details, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1 ) AS Annee_calculee WHERE Annee_calculee = 2008 LIMIT 0 , 30
Pas d'erreur, mais pas plus de résultats (que ce soit WHERE ou HAVING ) !



:oops: Vous allez croire que j'aime le sport, hein :lol:

par Berzemus » 01 févr. 2008, 12:16

Puisque je le dis.. je ne vois pas en quoi cette requête ne fonctionnerait pas:

Code : Tout sélectionner

Select Dte_jour, Annee_calculee FROM ( SELECT Dte_Jour, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1) AS table WHERE Annee_calculee =2008 LIMIT 0 , 30

par mojorisin » 01 févr. 2008, 08:55

Salut,
un WHERE dans une requete sert de filtre pour une requete, les différentes clauses composant ce filtre doivent porter sur des champs présent en base de données.
Pour filtrer sur sur des alias ou des champs rapatriés il te faut utiliser la clause HAVING qui elle s'applique sur le résultat de la requete.

par Patriboom » 01 févr. 2008, 01:01

Non, non.
Je n'ai pas créé de sous-requête.
La seconde requête est seulement là pour montrer qu'il ne s'agit pas de faute de syntaxe ou d'orthographe. Ce sont deux requête indépendantes et seulement la première m'intéresse.

Devrais-je imaginer une sous-requête?

------------------

Oublie ça. Je me complique la vie pour rien.

Une simple requête avec des OR et AND bien placés saura satisfaire.

J'ai essayé la sous-requête, mais j'ai obtenu le même résultat

Code : Tout sélectionner

SELECT Nom, YEAR( Dte_Debut ) IN ( SELECT Dte_Debut FROM virtu_evenmt WHERE id_diocese =4 OR YEAR( Dte_Debut ) =2007 ) AS Choix FROM virtu_evenmt WHERE Choix =2007
#1054 - Unknown column 'Choix' in 'where clause'

Ma question reste entière. Si y en a qui veulent se casse la tête pour le sport, j'apprécierais connaître les conclusions de vos investigations.
:?: Est-ce qu'on peut faire une condition d'une colonne créée avec CASE / THEN / ELSE / AS :?:

par Berzemus » 31 janv. 2008, 22:27

Si tu la crée dans une sous-requête, si. :wink:

Probleme CASE THEN

par Patriboom » 31 janv. 2008, 19:04

Voici ma table:

Code : Tout sélectionner

CREATE TABLE `paroisses_feries` ( `id_ferie` int(11) NOT NULL auto_increment, `id_paroisse` int(11) NOT NULL, `Dte_Jour` int(11) NOT NULL, `Dte_Mois` int(11) NOT NULL, `Dte_Annee` int(11) NOT NULL, `ferie_type` enum('Une fois','Annuel','Special') NOT NULL, `Details` varchar(50) NOT NULL, PRIMARY KEY (`id_ferie`) )
Voici ma requête et son résultat:

Code : Tout sélectionner

SELECT Dte_Jour, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1 AND Annee_calculee =2008 LIMIT 0 , 30 MySQL a répondu:Documentation #1054 - Unknown column 'Annee_calculee' in 'where clause'

Mon problème est le suivant: Je veux obtenir les fêtes annuelles, les congés fériés aussi bien que les fêtes ponctuelles.

Dans cette requête, tout fonctionne bien:

Code : Tout sélectionner

SELECT Dte_Jour, CASE WHEN ferie_type = 'Annuel' THEN 2008 ELSE Dte_Annee END AS Annee_calculee FROM paroisses_feries WHERE Dte_Mois =1 ORDER BY Annee_calculee ASC LIMIT 0 , 30
Est-il donc impossible de recourir à une colonne créée pour faire un WHERE :?: