Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
900 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme alias/where

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme alias/where

n°2179128
sltpaulo
Posté le 07-03-2013 à 10:00:52  profilanswer
 

Bonjour à vous, voilà je recherche une solution depuis quelque temps déjà sans vraiment en trouvé une, j'aimerai pouvoir utiliser mes alias dans une condition "WHERE" je vous mais un extrait de ma requête (construite dynamiquement) :
 

Code :
  1. select SQL_CALC_FOUND_ROWS
  2.     d.dt_name as st,
  3.     round(sum(CASE
  4.                 WHEN
  5.                     (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) > - 5000000
  6.                         AND (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) < 1
  7.                 THEN
  8.                     fr_amount / 100
  9.                 ELSE 0
  10.             END),
  11.             4) AS 'NYD',
  12.     round(sum(CASE
  13.                 WHEN
  14.                     (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) > 30
  15.                         AND (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) < 61
  16.                 THEN
  17.                     fr_amount / 100
  18.                 ELSE 0
  19.             END),
  20.             4) AS '31_60',
  21.     round(sum(CASE
  22.                 WHEN
  23.                     (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) > - 5000000
  24.                         AND (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) < 1
  25.                 THEN
  26.                     fr_amount / 100
  27.                 WHEN
  28.                     (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) > 30
  29.                         AND (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) < 61
  30.                 THEN
  31.                     fr_amount / 100
  32.                 ELSE 0
  33.             END),
  34.             4) AS 'Amount'
  35. from
  36.     missions m
  37.         join
  38.     debtors d ON mi_id = dt_mi_id
  39.         join
  40.     topics t ON dt_id = tp_dt_id
  41.         join
  42.     receivables r ON tp_id = rc_tp_id
  43.         join
  44.     fractions f ON rc_id = fr_rc_id
  45.         left join
  46.     client_segments s ON mi_cl_id = cls_cl_id
  47.         and dt_cls_id = cls_id
  48.         left outer join
  49.     client_delays dl ON dl.cld_id = r.rc_cld_id
  50.         and dl.cld_cl_id = 85
  51. where
  52.     mi_id in (199)
  53.         and fr_status in ('NS' , 'IQ',
  54.         'IM',
  55.         'VA',
  56.         'GO',
  57.         'EN',
  58.         'P1',
  59.         'PA',
  60.         'CL')
  61.         and cls_id in (2 , 3, 4, 5)
  62.         and rc_in_scope = 'Y'
  63.         and (cld_id in (1 , 2,
  64.         11,
  65.         4,
  66.         5,
  67.         15,
  68.         16,
  69.         7,
  70.         12,
  71.         13,
  72.         14,
  73.         20,
  74.         8,
  75.         19,
  76.         9,
  77.         17,
  78.         18,
  79.         10,
  80.         0)
  81.         or cld_id is null)
  82.         and tp_us_id in (223 , 224,
  83.         229,
  84.         222,
  85.         230,
  86.         226,
  87.         225,
  88.         227,
  89.         231,
  90.         228,
  91.         211,
  92.         214,
  93.         215,
  94.         213,
  95.         218,
  96.         217,
  97.         219,
  98.         216,
  99.         293,
  100.         295,
  101.         210,
  102.         294,
  103.         220,
  104.         241,
  105.         212,
  106.         221)
  107.         and cls_cl_id = 85
  108.         and (((TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) > - 5000000
  109.         AND (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) < 1)
  110.         or ((TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) > 30
  111.         AND (TO_DAYS('2013-03-06') - TO_DAYS(r.rc_date_due)) < 61))
  112.         and m.mi_date_ended is null
  113.         and ('d.dt_name' LIKE '%4%'
  114.         OR 'NYD' LIKE '%4%'
  115.         OR '31_60' LIKE '%4%'
  116.         OR 'Amount' LIKE '%4%')
  117. group by st
  118. order by d.dt_name asc
  119. limit 0 , 10


 
Mon problème apparrait à la ligne 114
 
Merci de vos réponse,
 
celui qui trouve je lui paye un verre sur Paris :-)


Message édité par sltpaulo le 07-03-2013 à 10:02:27
mood
Publicité
Posté le 07-03-2013 à 10:00:52  profilanswer
 

n°2179140
rufo
Pas me confondre avec Lycos!
Posté le 07-03-2013 à 10:42:20  profilanswer
 

Les alias du Select ne peuvent être utilisés dans le Where. Pour rappel, le Select contient le résultat du Where. Dans ces conditions, tu vois bien que ça se "mordrait la queue". Pour filtrer les enregistrements remontés dans le select, soit tu passes par une requête dans laquelle ta requête actuelle est une sous-requête (où tu aurais retiré les critères de filtrages qui posent soucis et que tu aurais mis ans le Where de la requête "mère", celle "au-dessus de la sous-requête), soit tu passes par la clause Having. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2179145
sltpaulo
Posté le 07-03-2013 à 10:50:36  profilanswer
 

Euréka, il faut croire que j'ai été touché par la grace divine ce matin, j'ai trouvé, pas besoin de vous tracasser pour moi :) je vous mets la solution :
 

Code :
  1. select SQL_CALC_FOUND_ROWS
  2.    *
  3. from
  4.    (select
  5.        d.dt_name as st,
  6.            round(sum(CASE
  7.                WHEN
  8.                    (TO_DAYS('2013-03-07') - TO_DAYS(r.rc_date_due)) > - 5000000
  9.                        AND (TO_DAYS('2013-03-07') - TO_DAYS(r.rc_date_due)) < 1
  10.                THEN
  11.                    fr_amount / 100
  12.                ELSE 0
  13.            END), 4) AS 'NYD',
  14.            round(sum(CASE
  15.                WHEN
  16.                    (TO_DAYS('2013-03-07') - TO_DAYS(r.rc_date_due)) > - 5000000
  17.                        AND (TO_DAYS('2013-03-07') - TO_DAYS(r.rc_date_due)) < 1
  18.                THEN
  19.                    fr_amount / 100
  20.                ELSE 0
  21.            END), 4) AS 'Amount'
  22.    from
  23.        missions m
  24.    join debtors d ON mi_id = dt_mi_id
  25.    join topics t ON dt_id = tp_dt_id
  26.    join receivables r ON tp_id = rc_tp_id
  27.    join fractions f ON rc_id = fr_rc_id
  28.    left join client_segments s ON mi_cl_id = cls_cl_id
  29.        and dt_cls_id = cls_id
  30.    left outer join client_delays dl ON dl.cld_id = r.rc_cld_id
  31.        and dl.cld_cl_id = 85
  32.    where
  33.        mi_id in (205)
  34.            and fr_status in ('NS' , 'IQ', 'IM', 'VA', 'GO', 'EN', 'P1', 'PA', 'CL')
  35.            and cls_id in (2 , 3, 4, 5)
  36.            and rc_in_scope = 'Y'
  37.            and (cld_id in (1 , 2, 11, 4, 5, 15, 16, 7, 12, 13, 14, 20, 8, 19, 9, 17, 18, 10, 0)
  38.            or cld_id is null)
  39.            and tp_us_id in (223 , 224, 229, 222, 230, 226, 225, 227, 231, 228, 211, 214, 215, 213, 218, 217, 219, 216, 293, 295, 210, 294, 220, 241, 212, 221)
  40.            and cls_cl_id = 85
  41.            and (((TO_DAYS('2013-03-07') - TO_DAYS(r.rc_date_due)) > - 5000000
  42.            AND (TO_DAYS('2013-03-07') - TO_DAYS(r.rc_date_due)) < 1))
  43.            and m.mi_date_ended is null
  44.    group by st
  45.    order by st asc
  46. ) as t
  47. where
  48.    (st LIKE '%12342.00%'
  49.        OR NYD LIKE '%12342.00%'
  50.        OR Amount LIKE '%12342.00%')
  51.    limit 0 , 10


 
Juste attention, le limit doit être à l'extérieur sinon vous ne sélectionner que les colonnes de la première requête, ensuite le SQL_CALC_FOUND_ROWS
pour la fonction FOUND_ROWS() de sql ne peut être que dans la requête de sortie => erreur sinon, également, ne pas oublier de faire un alias sur la sortie de la requete imbriquée. Un soucis à cette méthode est qu'il est obligatoire d'utiliser le nom des colonnes de sortie de la requête imbriqué (exemple j'ai écris d.dt_name as st, je dois donc utiliser 'st' et non d.dt_name qui n'est plus défini, par contre si j'écris d.dt_name sans alias, je peux le réutiliser).
 
J'ai vu pas mal de post  sur le net sans réponses, j'espère que je pourrai aider certaines personnes qui ont le même problème.
 
Cordialement,  
 
Paul
 
Edit : Merci rufo, mais le having ne fonctionnait pas dans mon cas


Message édité par sltpaulo le 07-03-2013 à 10:51:36

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme alias/where

 

Sujets relatifs
problème éclipse et les variables d'environementProblème avec htaccess et une expression régulière..
Appel de fonction dans fonction : PROBLEME!Petit problème avec Lightbox 2
problème de compteurProblème de compilateur
Alias EasyPHP sur lecteur réseau[Apache2] Mon alias me retourne une 403 !
[JAVA/STRUST] problème d'encodage[RESOLU] problème de temps dans un userform
Plus de sujets relatifs à : Probleme alias/where


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR