2017-02-13 2 views
2

Я хочу сделать мой отчет быстрее, потому что он долго загружается, мне было интересно, есть ли способ сделать несколько отсчетов только из одного выбора.MYSQL: Сделайте несколько отсчетов от одного выберите

Пример, сделать это выбрать пожелание не собирается менять для подсчета

SELECT IDS, Fecha_Recarga, Banco_Recarga, Tipo, Status, RefVerif, MontoVerif, RecargaDuplicada FROM transaccionesrr WHERE Fecha_Recarga = '2017-02-07' AND Banco_Recarga = 'BANESCO' AND Tipo = 'RECARGA' AND Status = 'PROCESADA' 

И на основании результата этого выбора я хочу сделать несколько счетчиков, как

Count (*) WHERE RefVerif = '1' AS RefVerif 
Count (*) WHERE RefVerif = '1' AND MontoVerif = '0' AS MontoVerif 
Count (*) WHERE RecargaDuplicada = '1' AS Duplicada 

Это Сохраненная процедура, которую я имею в курсе

SELECT COUNT(*) AS RECARGAS, 

(SELECT COUNT(*) FROM transaccionesrr WHERE Tipo = 'RECARGA' AND Status = 'PROCESADA' AND Fecha_Recarga BETWEEN PRM_Fecha_Desde AND PRM_Fecha_Hasta AND Banco_Recarga = PRM_Banco AND RefVerif = '1') AS VERIFICADAS, 

(SELECT COUNT(*) FROM transaccionesrr WHERE Tipo = 'RECARGA' AND Status = 'PROCESADA' AND Fecha_Recarga BETWEEN PRM_Fecha_Desde AND PRM_Fecha_Hasta AND Banco_Recarga = PRM_Banco AND RefVerif = '0') AS NOVERIFICADAS, 

(SELECT COUNT(*) FROM transaccionesrr WHERE Tipo = 'RECARGA' AND Status = 'PROCESADA' AND Fecha_Recarga BETWEEN PRM_Fecha_Desde AND PRM_Fecha_Hasta AND Banco_Recarga = PRM_Banco AND RefVerif = '1' AND MontoVerif = '0') AS MONTOVERIF, 

(SELECT COUNT(*) FROM transaccionesrr WHERE Tipo = 'RECARGA' AND Status = 'PROCESADA' AND Fecha_Recarga BETWEEN PRM_Fecha_Desde AND PRM_Fecha_Hasta AND Banco_Recarga = PRM_Banco AND RecargaDuplicada = '1') AS DUPLICADAS 

FROM transaccionesrr WHERE Tipo = 'RECARGA' AND Status = 'PROCESADA' AND Fecha_Recarga BETWEEN PRM_Fecha_Desde AND PRM_Fecha_Hasta AND Banco_Recarga = PRM_Banco ; 

Im пытаюсь сделать это, потому что я думаю это будет быстрее, если вы подумаете, что есть лучший способ, которым я буду признателен.

Я пытался сделать решение в течение нескольких дней, но я не нахожу

+0

Я не знаю, что много о SQL, но я считаю, что запросы были бы Быстрее, если вы сохраняете 'RefVerif' как int, а не символ? Таким образом, вы используете 'RefVerif = 1' вместо использования одинарных кавычек. –

+0

Я попробую это, спасибо –

ответ

1

Использование условной агрегации:

SELECT COUNT(*) AS RECARGAS, 
     SUM(RefVerif = '1') AS VERIFICADAS, 
     SUM(RefVerif = '0') AS NOVERIFICADAS, 
     SUM(RefVerif = '1' AND MontoVerif = '0') AS MONTOVERIF, 
     SUM(RecargaDuplicada = '1') AS DUPLICADAS 
FROM transaccionesrr 
WHERE Tipo = 'RECARGA' AND Status = 'PROCESADA' AND 
     Fecha_Recarga BETWEEN PRM_Fecha_Desde AND PRM_Fecha_Hasta AND 
     Banco_Recarga = PRM_Banco ; 
+0

Спасибо, Гордон, он отлично работал –

+1

Отчет от 18sec до 3.5sec. Спасибо –

+1

Он может работать быстрее с индексом '(Tipo, Status, Banco_Recarga, Fecha_Recarga)'. –

Смежные вопросы