当这些相同的CODE具有FINAL DATE为FALSE的其他行时,如何仅获取FINALDATE为TRUE的行

问题描述 投票:0回答:1

我正在尝试通过Group By获取SQL查询,返回返回的内容,但是能够在重复CODE并且有两个记录的情况下,一个使用FINALDATE:TRUE而另一个使用FINALDATE:FALSE,可以不显示包含FINALDATE的记录:FALSE。这可能吗?非常感谢你提前。 (我在Oracle工作)

一声问候

查询:

SELECT distinct H1.CODE, ZL.DES AS ZONE, TIP.ABR, H1.ID_ITA, CASE (RS.FE_EN)
WHEN TO_DATE('10-01-2018', 'DD/MM/YYYY') THEN 'True'
ELSE 'False'
END AS FINALDATE
FROM SCHEMA.Fnt_Habitaciones h1 
INNER   JOIN  SCHEMA.GEN_ITA_PO  TIP   ON H1.ID_ITA_PO = TIP.ID_ITA_PO
LEFT    JOIN  SCHEMA.PIS_ITA   PZ    ON H1.ID_ITA = PZ.ID_HABITACIONES
LEFT    JOIN  SCHEMA.PIS_ZOEZA   ZL    ON ZL.ID_ZOEZA = PZ.ID_ZOEZA  AND 0 
IS NOT NULL AND 0 = 1
INNER   JOIN  SCHEMA.RES_RESERVAS       RS    ON RS.ID_ITA = H1.ID_ITA
WHERE h1.activo=1 AND h1.id_esta= 15 AND (48 IS NULL OR 48 IS NOT NULL AND 
H1.ID_BLOQUES = 48)
AND h1.id_ita NOT IN 
( 
 SELECT hin.id_ita 
 FROM SCHEMA.Res_Reservas r 
 INNER JOIN SCHEMA.Fnt_ita hin ON hin.id_ita = r.id_ita 
 WHERE r.id_establecimientos = hin.id_establecimientos AND 
 hin.id_establecimientos = 15 AND r.id_ita IS NOT NULL 
 AND (('10-01-2018' > r.FE_EN AND '10-01-2018' <= r.fecha_salida ) OR ('10-
 01-2018' < r.FE_EN AND '10-01-2018' >= r.fecha_salida)) 
) AND h1.id_ita NOT IN 
  (   
   SELECT hbin.id_ita FROM SCHEMA.Fnt_BloHab b 
   INNER JOIN SCHEMA.Fnt_ita hbin ON hbin.id_ita = b.id_ita 
   WHERE b.activo=1 AND '10-01-2018' >= b.fecha_inicio AND '10-01-2018' <= 
   b.fecha_fin AND b.indHouKee = 1
  )
GROUP BY ZL.DES, H1.CODE, TIP.ABR,H1.ID_ita, RS.FE_EN
ORDER BY ZL.DES, h1.CODE ASC;

结果:

CODE     ZONE       ABR  ID_ITA FINALDATE   

0123    (null)      DFAP 3349   False
1013    (null)      DST  3257   False
1105    (null)      DFA  3373   False --> I want this will nop appear in result. Because we have a TRUE with this CODE.
1105    (null)      DFA  3373   True
2105    (null)      DST  3541   False
3019    (null)      DSTV 3644   False
4001    (null)      SES  3798   False
4003    (null)      SES  3799   False
4005    (null)      SES  3800   False
4011    (null)      DSU  3803   True
4011    (null)      DSU  3803   False --> I want this will nop appear in result. Because we have a TRUE with this CODE.
4025    (null)      JUS  3813   False

谢谢!

sql oracle
1个回答
2
投票

看起来你可以只使用聚合,它依赖于'True'之前'False'的字母排序:

SELECT H1.CODE, ZL.DES AS ZONE, TIP.ABR, H1.ID_ITA,
  MAX(
    CASE RS.FE_EN 
      WHEN TO_DATE('10-01-2018', 'DD/MM/YYYY') THEN 'True'
      ELSE 'False'
    END
  ) AS FINALDATE
...
GROUP BY ZL.DES, H1.CODE, TIP.ABR, H1.ID_ita
ORDER BY ZL.DES, h1.CODE ASC;

特定的RS.FE_EN从group-by子句中删除,因为现在只在聚合的max()函数调用中引用。


作为一个侧面问题,您似乎依赖于隐式转换和会话的NLS设置等

'10-01-2018' > r.FE_EN AND '10-01-2018' <= r.fecha_salida

最好将字符串显式转换为日期,就像在case表达式中一样;或使用日期文字:

DATE '2018-01-10' > r.FE_EN AND DATE '2018-01-10' <= r.fecha_salida

等等。;您也可以在case表达式中使用它而不是to_date()

© www.soinside.com 2019 - 2024. All rights reserved.