Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-12-2018
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cómo coloque en http://www.clubdelphi.com/foros/showthread.php?t=93348, usa el query planner, que es el que te dice que es lo que hace la BD.

Hay mucho que resalta en tu query. De entrada, el que no estes usando campos fecha para las comparaciones.

RIGTH() no se puede optimizar con indices.

Este tipo de consulta se beneficia bastante con el uso de las funciones WINDOW

https://www.brentozar.com/sql-syntax...es-sql-server/

Hay que buscar en reducir esos join, y poner los datos mas secuenciales. Si pones un ejemplo con DATOS, quizás en http://sqlfiddle.com te puedo echar una mano.


P.D: Y no dices que significa "ineficiente"
__________________
El malabarista.
Responder Con Cita
  #2  
Antiguo 13-12-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 13
bucanero Va camino a la fama
Hola a todos!!

Revisa si te sirve la instrucción PIVOT de MSSQL que lo que hace es agrupar registro en columnas en función del valor de un campo (ejemplo mes) y para estos temas es útil, aunque tiene algunas limitaciones, como solo poder utilizar un único campo de pivot, con una única función de resultado

Aqui te dejo este ejemplo aplicado a tu sentencia, donde obtienes en un único registro la cuenta y el saldo para cada uno de los doce meses
Código SQL [-]
  SELECT  tcuenta,
  ISNULL([1], 0) as enero, 
  ISNULL([2], 0) as febrero, 
  ISNULL([3], 0) as marzo, 
  ISNULL([4], 0) as abril, 
  ISNULL([5], 0) as mayo, 
  ISNULL([6], 0) as junio, 
  ISNULL([7], 0) as julio,  
  ISNULL([8], 0) as agosto, 
  ISNULL([9], 0) as septiembre, 
  ISNULL([10], 0) as octubre, 
  ISNULL([11], 0) as noviembre, 
  ISNULL([12], 0) as diciembre
  FROM  (
    select tcuenta, month(tperiod) as mes,  sum(tdebe)-sum(thaber) as saldo
    from cdtrans as tr
    where year(tperiod) = year(getdate())
    and tcuenta is not null
    group by  tcuenta, month(tperiod)  
  ) AS SourceTable  
  PIVOT (  
    sum(saldo)  -- aqui es necesario poner siempre una función para obtener resultados
    FOR mes IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])  
  ) AS PivotTable

Y aquí integrándolo con el resto de tu sentencia

Código SQL [-]
select cac.mcuenta, cac.mnombre, 
    saldo.enero, 
    -- ...,  
    saldo.diciembre, 
    inicial.saldo
from cacuent as cac
left join (
  select tr.tcuenta, sum(tdebe) as debe, sum(thaber) as haber, sum(tdebe)-sum(thaber) as saldo
  from cdtrans as tr
  where year(tperiod) = 2006
  and tcuenta is not null
  group by tcuenta
) as inicial on cac.MCUENTA = inicial.TCUENTA
left join (
  SELECT  tcuenta,
  ISNULL([1], 0) as enero, 
  ISNULL([2], 0) as febrero, 
  ISNULL([3], 0) as marzo, 
  ISNULL([4], 0) as abril, 
  ISNULL([5], 0) as mayo, 
  ISNULL([6], 0) as junio, 
  ISNULL([7], 0) as julio,  
  ISNULL([8], 0) as agosto, 
  ISNULL([9], 0) as septiembre, 
  ISNULL([10], 0) as octubre, 
  ISNULL([11], 0) as noviembre, 
  ISNULL([12], 0) as diciembre
  FROM  (
    select tcuenta, month(tperiod) as mes,  sum(tdebe)-sum(thaber) as saldo
    from cdtrans as tr
    where year(tperiod) = 2006
    and tcuenta is not null
    group by  tcuenta, month(tperiod)  
  ) AS SourceTable  
  PIVOT (  
    sum(saldo)  
    FOR mes IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])  
  ) AS PivotTable 
) saldo on cac.MCUENTA = saldo.tcuenta

Para obtener los otros campos (las suma del debe y del haber) tendrías que insertar otros dos bloques mas de JOIN. De esta forma finalmente se te quedarían tan solo 4 bloques JOIN en la consulta (calculo inicial, calculo debe, calculo haber y saldos) frente a los 13 bloques que tienes actualmente.

Un Saludo
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Restar Meses Neeruu Varios 3 17-03-2014 14:35:22
Busqueda x meses gdlrinfo Conexión con bases de datos 1 22-03-2008 01:41:55
Calcular nº de meses Drahcir SQL 3 20-12-2006 19:31:38
Meses desde una fecha dec Trucos 0 01-07-2006 00:37:29
Dias y meses romansiux Varios 5 13-06-2005 17:19:12


La franja horaria es GMT +2. Ahora son las 01:56:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi