none
Optimizar y crear bucle sql RRS feed

  • Pregunta

  • Hola buenas a todos soy nuevo en el foro y no se me da muy bien sql, necesitaría alguna ayuda por favor.

    Me han dicho que tengo que optimizar esta consulta ya que siempre que se ejecuta el servidor se cae porque no da abasto. También me han que debo crear un bucle para ahorrar lineas.

    En el bucle había pensando en un while para que se ejecute los 12 meses del año con un if para que cuando llegue al mes 12 se reinicie a 1. Ya que si ejecutamos la consulta en noviembre empezara por el mes 11, continuara por el mes 12 y tiene que pasar al mes 1, Pero siempre un total de 12 meses.

    Esta seria la consulta sql:

    Muchas gracias de antemano 

    SELECT clientes.codigo, clientes.denominacionFiscal,
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes082019.horaFacturables)))) AS 'FAC082019',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes082019.horaReportadas)))) AS 'REP082019',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes092019.horaFacturables)))) AS 'FAC092019',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes092019.horaReportadas)))) AS 'REP092019',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes102019.horaFacturables)))) AS 'FAC102019',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes102019.horaReportadas)))) AS 'REP102019',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes112019.horaFacturables)))) AS 'FAC112019',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes112019.horaReportadas)))) AS 'REP112019',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes122019.horaFacturables)))) AS 'FAC122019',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes122019.horaReportadas)))) AS 'REP122019',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes012020.horaFacturables)))) AS 'FAC012020',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes012020.horaReportadas)))) AS 'REP012020',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes022020.horaFacturables)))) AS 'FAC022020',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes022020.horaReportadas)))) AS 'REP022020',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes032020.horaFacturables)))) AS 'FAC032020',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes032020.horaReportadas)))) AS 'REP032020',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes042020.horaFacturables)))) AS 'FAC042020',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes042020.horaReportadas)))) AS 'REP042020',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes052020.horaFacturables)))) AS 'FAC052020',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes052020.horaReportadas)))) AS 'REP052020',
    
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes062020.horaFacturables)))) AS 'FAC062020',
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes062020.horaReportadas)))) AS 'REP062020',
     (SEC_TO_TIME(SUM(TIME_TO_SEC(mes072020.horaFacturables)))) AS 'FAC072020', 
    (SEC_TO_TIME(SUM(TIME_TO_SEC(mes072020.horaReportadas)))) AS 'REP072020', 
    
     usuarios.nombreCompleto AS nombreCompleto, clientes.localidad AS localidad, clientes.idprovincias AS provincia
    FROM clientes
    INNER JOIN usuarios ON usuarios.id= clientes.idConsultor
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 08 AND YEAR(fecha)= 2019) mes082019 ON clientes.codigo = mes082019.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 09 AND YEAR(fecha)= 2019) mes092019 ON clientes.codigo = mes082019.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 10 AND YEAR(fecha)= 2019) mes102019 ON clientes.codigo = mes102019.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 11 AND YEAR(fecha)= 2019) mes112019 ON clientes.codigo = mes112019.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 12 AND YEAR(fecha)= 2019) mes122019 ON clientes.codigo = mes122019.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 01 AND YEAR(fecha)= 2020) mes012020 ON clientes.codigo = mes012020.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 02 AND YEAR(fecha)= 2020) mes022020 ON clientes.codigo = mes022020.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 03 AND YEAR(fecha)= 2020) mes032020 ON clientes.codigo = mes032020.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 04 AND YEAR(fecha)= 2020) mes042020 ON clientes.codigo = mes042020.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 05 AND YEAR(fecha)= 2020) mes052020 ON clientes.codigo = mes052020.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 06 AND YEAR(fecha)= 2020) mes062020 ON clientes.codigo = mes062020.cliente
    LEFT JOIN (
    SELECT id_cust,customer.cliente,horaFacturables, horaReportadas
    FROM customer
    WHERE gender in (1,2) AND MONTH(fecha) = 07 AND YEAR(fecha)= 2020) mes072020 ON clientes.codigo = mes072020.cliente
    WHERE clientes.estatus='Alta'
    GROUP BY clientes.codigo

    viernes, 24 de julio de 2020 7:57

Todas las respuestas

  • Hola Nacherasg:

    Varias cosas.

    También me han que debo crear un bucle para ahorrar lineas.

    Eso es una aberración. En sql no te cobran por las lineas utilizadas. Tú código se puede optimizar sin duda, pero ahorrar lineas no es mejorar código. Y hacer bucles es muy mala técnica en los lenguajes de conjuntos (SQL)

    SEC_TO_TIME

    Esa función es de mySql y esto es un foro de Microsoft SQL Server, son dos lenguajes muy parecidos pero diferentes. Cada uno tiene sus particularidades.

    Lo que tienes que mejorar es la lectura de la misma tabla de customer, que haces muchas veces por una sola obteniendo el mes, y luego en la query en función del mes hacer un case.

    Para mysql puedes probar en StackOverflow

    O en foro mysql español

    Si lo que necesitas es reconvertirla a TSQL, confirmalo, please


    viernes, 24 de julio de 2020 10:13
  • Hola muchas gracias por la respuesta.

    Probare en el foro de StackOverFlow, pero con que se pueda optimizar para que el servidor no se bloque seria genial, muchas gracias por los consejos de no usar bucles o no ahorrar lineas en estos casos.

    Muchas gracias

    viernes, 24 de julio de 2020 11:05
  • Hola Nacherasg:

    En stackOverFlow, para que tú pregunta sea bien recibida, debes de poner la definición de las tablas. Además de algunos datos de ejemplo. Luego la pregunta tal cual la planteas aquí.

    Algo así como:

    Tengo una tabla clientes con esta definición.

    .... (solo las columnas importantes)

    Tengo una tabla usuarios con esta definición:

    .... (solo las columnas importantes)

    Tengo una tabla customer con esta definición:

    .... (solo las columnas importantes por ejemplo id_cust,customer.cliente,horaFacturables, horaReportadas,gender, fecha, estatus)

    Añadir algunos datos, tipo (te pongo la sintaxis TSQL, porque para mySql tengo que recordar, y la otra la tengo más a mano en el cerebro).

    Insert into clientes (..cols....)

    values (1,...),(....)

    Lo mismo para las otras tablas.

    Y luego tú pregunta.

    Es probable que te pidan indices si los tienes, pero con eso es suficiente, para obtener una mejora muy sustancial.

    Cuanto mejor sea la pregunta (por detallada), mejor será la respuesta.

    Suerte

    viernes, 24 de julio de 2020 11:24