Ver Mensaje Individual
  #1  
Antiguo 22-08-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Reputación: 21
Angel.Matilla Va por buen camino
SELECT muy complejo

Necesito hacer un SELECT pero la forma que se me ha ocurrido creo que es demasiado compleja y por lo tanto lenta; funciona bien pero quisiera, a ser posible, agilizar la ejecución del query. Ahora tengo esto, aunque es un poco monstruoso:
Código PHP:
SELECT 1, COUNT(*), 'Sin cuenta' 
  
FROM Ls01 
 WHERE ForPago 
= :ForPago 
   
AND Iban = '' 
 
UNION
SELECT 2
, COUNT(*), 'Ctas. correctas' 
  
FROM Ls01 
 WHERE ForPago 
= :ForPago 
   
AND Iban <> '' 
   
AND SUBSTRING(Iban FROM 1 FOR 2) IN (SELECT Codigo FROM Pais WHERE Codigo <> 'PD') 
 
UNION 
SELECT 3
, COUNT(*), 'Ctas. erróneas' 
  
FROM Ls01 
 WHERE ForPago 
=  :ForPago 
   
AND Iban <> '' 
   
AND SUBSTRING(Iban FROM 1 FOR 2) NOT IN (SELECT Codigo FROM Pais) 
 
UNION 
SELECT 4
, COUNT(*), 'Ctas. extranjero' 
  
FROM Ls01 
 WHERE ForPago 
= :ForPago 
   
AND Iban <> '' 
   
AND SUBSTRING(Iban FROM 1 FOR 2) IN (SELECT Codigo FROM Pais WHERE Codigo NOT IN ('ES', 'PD')) 
    
ORDER BY 1 
</div>

Estaba pensando en hacer un SELECT...CASE, pero ninguna de las dos formas que he probado me funciona.
Este query:
Código PHP:
SELECT COUNT(*),
   CASE
     
WHEN Iban = '' THEN 1
     WHEN Iban 
<> '' AND SUBSTRING(Iban FROM 1 FOR 2) IN (SELECT Codigo FROM Pais WHERE Codigo <> 'PD') THEN 2
     WHEN Iban 
<> '' AND SUBSTRING(Iban FROM 1 FOR 2) NOT IN (SELECT Codigo FROM Pais) THEN 3
     WHEN Iban 
<> '' AND SUBSTRING(Iban FROM 1 FOR 2) IN (SELECT Codigo FROM Pais WHERE Codigo NOT IN ('ES', 'PD')) THEN 4
   END 
AS TipCue
  FROM Ls01
 WHERE ForPago 
= :ForPago
 GROUP BY 2 
al tratar de ejecutarlo me da este error
Cita:
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Y esta otra forma:
Código PHP:
SELECT COUNT(*)
  
FROM Ls01
 WHERE ForPago 
= :ForPago AND
   CASE
     
WHEN Iban = '' THEN 1
     WHEN Iban 
<> '' AND SUBSTRING(Iban FROM 1 FOR 2) IN (SELECT Codigo FROM Pais WHERE Codigo <> 'PD') THEN 2
     WHEN Iban 
<> '' AND SUBSTRING(Iban FROM 1 FOR 2) NOT IN (SELECT Codigo FROM Pais WHERE Codigo <> 'PD') THEN 3
     WHEN Iban 
<> '' AND SUBSTRING(Iban FROM 1 FOR 2) IN (SELECT Codigo FROM Pais WHERE Codigo NOT IN ('ES', 'PD')) THEN 4
   END 
= 1 
me devuelve una única fila con valor 1. ¿Se puede hacer lo que pretendo?
Responder Con Cita