Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Varios Count en select

Estas en el tema de Varios Count en select en el foro de SQL Server en Foros del Web. Hola a todos, una consulta, tengo un procedure que realiza varios count y sum a la vez por cada sucursal que tengan y por dia... ...
  #1 (permalink)  
Antiguo 09/07/2008, 14:33
 
Fecha de Ingreso: enero-2002
Ubicación: Callao - Perú
Mensajes: 1.127
Antigüedad: 22 años, 4 meses
Puntos: 0
Exclamación Varios Count en select

Hola a todos, una consulta, tengo un procedure que realiza varios count y sum a la vez por cada sucursal que tengan y por dia... pero esta demora demasiado, como podria "agilizarlo"??

Este es mi store..

Alter Procedure usp_Sucursales
@fecConsulta varchar(15)
as
SELECT cCODSUC,
(select count(dfeclla) from datos a where replace(convert(varchar(15), a.dfeclla, 102), '.','') = @fecConsulta
and a.ctipo = 'S' and a.ccodsuc = d.ccodsuc)as TotLlamS ,
(select sum(nDURACI) from datos a where replace(convert(varchar(15), dfeclla, 102), '.','') = @fecConsulta
and a.ctipo = 'S' and a.ccodsuc = d.ccodsuc)as Duracion ,
(select sum(nCstLla)from datos a where replace(convert(varchar(15), dfeclla, 102), '.','') = @fecConsulta
and a.ctipo = 'S' and a.ccodsuc = d.ccodsuc)as Costo ,
(select count(dfeclla) from datos a where replace(convert(varchar(15), dfeclla, 102), '.','') = @fecConsulta
and a.ctipo = 'E' and a.ccodsuc = d.ccodsuc) as TotLlamE,
(select sum(nDURACI) from datos a where replace(convert(varchar(15), dfeclla, 102), '.','') = @fecConsulta
and a.ctipo = 'E' and a.ccodsuc = d.ccodsuc)as DuracionEnt
FROM DATOS D
group by cCodSuc
order by cCodSuc

Gracias de antemano.
__________________
SaLuDoS dE:
PePeLuChO dEl PeRú PaRa El MuNdO
  #2 (permalink)  
Antiguo 10/07/2008, 11:54
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
Respuesta: Varios Count en select

para empezar te recomendaria que tu variable @fecConsulta que es de tipo varchar, la pongas en el formato universal yyyy-MM-dd para evitar hacer replace y convert (para manejar solo un cast)

ejemplo
Cita:
...
(select count(dfeclla) from datos a where a.dfeclla = cast(@fecConsulta,datetime)
and a.ctipo = 'S' and a.ccodsuc = d.ccodsuc)as TotLlamS ,
ahi estoy suponiendo que @fecConsulta está en formato "yyy-MM-dd"

después otrs cosa que pudes considerar es crear una tabla temportal para guardar los resultados de tu SUM haciendo solamente 2 queries (ya que tienen los mismos criterios

te paso la idea, ya dependerá de ti lo demás

Cita:
DECLARE @Result TABLE (
valor1 int,
valor2 int,
valor3 int
)

insert @result
select count(dfeclla),sum(nDURACI),sum(nCstLla)
from datos a where a.dfeclla = cast(@fecConsulta, datetime)
and a.ctipo = 'S'

select * from @Result
pongo 3 queries porque están usando el mismo criterio faltaría adaptarlo para las otras 2 queries y la llenes en la misma tabla, sería cuestión de que pruebes el code que te paso para que tengas un idea de lo que está haciendo

p.d. de paso te muevo al foro correspondiente donde te podrán dar una mejor ayudar

movido desde foro de .net

Saludos
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 11/07/2008, 08:55
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Varios Count en select

Tu consulta es muy sencilla pero la compilcaste demasiado leyendo 6 veces la tabla para obtener un resultado que puedes sacar con una sola leida a la tabla.

Tambien coincido con Rootk, debes transformar tu varible al tipo de dato que tiene tu campo, y no al reves, porque si hay 6000 registros en tu tabla en lugar de hacer un convert a la variable haces 6000 converts(1 por cada registro) y eso es lo que te esta pegando mas en el tiempo de respuesta de tu consulta.

Te anexo un ejemplo de como deberia quedar si estas utilizando SQL 2000.

Espero te sirva...

Código:
Alter Procedure usp_Sucursales
@fecConsulta varchar(15)  -- Suponiendo, segun el script que la fecha viene en formato YYYYMMDD
as

Declare @dFecConsulta datetime

Set @dFecConsulta  = convert(datetime, @fecConsulta)

SELECT  cCODSUC
       ,sum (Case When d.cTipo = 'S' Then 1 Else 0 End) TotLlamS
       ,sum (Case When d.cTipo = 'S' Then nDURACI Else 0 End ) DuracionS
       ,sum (Case When d.cTipo = 'S' Then nCstLla Else 0 End ) CostoS

       ,sum (Case When d.cTipo = 'E' Then 1 Else 0 End) TotLlamE
       ,sum (Case When d.cTipo = 'E' Then nDURACI Else 0 End ) DuracionE
       ,sum (Case When d.cTipo = 'E' Then nCstLla Else 0 End ) CostoE
FROM DATOS D
Where dfeclla = @dFecConsulta
group by cCodSuc
order by cCodSuc
Saludos a ambos.
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #4 (permalink)  
Antiguo 06/08/2008, 17:00
 
Fecha de Ingreso: enero-2002
Ubicación: Callao - Perú
Mensajes: 1.127
Antigüedad: 22 años, 4 meses
Puntos: 0
Exclamación Respuesta: Varios Count en select

Hola probe el store que me paso Andres95 pero necesitaria un dato mas, les explico cuando ejecuto el store de un dia X me muestra el siguiente resultado
Cita:
CodSuc # Saliente Costo_Sal Dura_sal #Entr #Duracion
01 2461 5964.11 1796.389 1623 2451.10
02 131 256.38 77.587 195 270.45
03 69 188.53 27.153 75 243.68
04 198 315.97 74.971 91 176.22
05 2296 5661.09 1096.903 4485 4996.40
Aca viene el tema, lo que pasa es que tengo 6 sucursales y necesito que se muestren todas como se muestra debajo:
Cita:
CodSuc # Saliente Costo_Sal Dura_sal #Entr #Duracion
01 2461 5964.11 1796.389 1623 2451.10
02 131 256.38 77.587 195 270.45
03 69 188.53 27.153 75 243.68
04 198 315.97 74.971 91 176.22
05 2296 5661.09 1096.903 4485 4996.40
06 0 NULL NULL 0 NULL
Como podria hacer, haciendo con la sentencia que puse al iniciar el tema, me funciona pero demora demasiado...

Gracias de antemano.
__________________
SaLuDoS dE:
PePeLuChO dEl PeRú PaRa El MuNdO
  #5 (permalink)  
Antiguo 07/08/2008, 15:06
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Varios Count en select

Código:
Alter Procedure usp_Sucursales
@fecConsulta varchar(15)  -- Suponiendo, segun el script que la fecha viene en formato YYYYMMDD
as

Declare @dFecConsulta datetime

Set @dFecConsulta  = convert(datetime, @fecConsulta)

SELECT  s.cCODSUC
       ,sum (Case When isnull(d.cTipo,'') = 'S' Then 1 Else 0 End) TotLlamS
       ,sum (Case When isnull(d.cTipo,'') = 'S' Then nDURACI Else 0 End ) DuracionS
       ,sum (Case When isnull(d.cTipo,'') = 'S' Then nCstLla Else 0 End ) CostoS

       ,sum (Case When isnull(d.cTipo,'') = 'E' Then 1 Else 0 End) TotLlamE
       ,sum (Case When isnull(d.cTipo,'') = 'E' Then nDURACI Else 0 End ) DuracionE
       ,sum (Case When isnull(d.cTipo,'') = 'E' Then nCstLla Else 0 End ) CostoE
FROM  (
       ---------------------------------------------------------------
	   -- Suponiendo que en Datos existen todas las sucursales,
       -- Aunque lo mejor seria hacer el join con el catalogo de
       -- Sucursales.	
       ---------------------------------------------------------------
	   Select cCODSUC
       FROM   DATOS D
	   group by cCodSuc  
      ) s
Left outer join
      DATOS D
On    s.cCODSUC = D.cCODSUC
Where dfeclla = @dFecConsulta
group by s.cCodSuc
order by s.cCodSuc
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:42.