Consulta Count de varias tablas

18/07/2005 - 10:37 por fjmrios | Informe spam
Hola, me gustaría realizar una consulta un poco complicada. Os
explico:
Tengo las tabla Empresas, Ventas, Citas y quiero sacar la siguiente
infomación :

NombreEmpresa Nº Citas Nº Ventas
Empresa1 20 10
Empresa2 10 5

Evidentemente en la columna NombreEmpresa debe aparecer empresas que
tengan solo citas o solo ventas. Muchas Gracias.

Preguntas similare

Leer las respuestas

#1 Incidencias KEKOS
18/07/2005 - 12:04 | Informe spam
Hola:

Me imagino que las tablas citas y ventas estaran relacionadas con la tabla
empresa, porque sino no se podria hacer. Esta es la consulta que deberias
utilizar:

dim sSql as string

sSQl="SELECT EMPRESAS.NOMEMPRESA, Count(CITAS.CODCITA) AS NUMCITAS, " & _
"Count(VENTAS.CODVENTA) AS NUMVENTAS " & _
"FROM (EMPRESAS LEFT JOIN CITAS ON EMPRESAS.NOMEMPRESA CITAS.NOMEMPRESA) LEFT JOIN " & _
"VENTAS ON EMPRESAS.NOMEMPRESA = VENTAS.NOMEMPRESA " & _
"GROUP BY EMPRESAS.NOMEMPRESA " & _
"HAVING Count(CITAS.CODCITA)>0 OR Count(VENTAS.CPDVENTA)>0 "

Nota: Lo que esta dentro de la instruccion having es para que selgan solo
aquellas empresas que tiene citas o ventas o las dos. Si citas o ventas
serian 0
no saldria en esta consulta.

escribió en el mensaje
news:
Hola, me gustaría realizar una consulta un poco complicada. Os
explico:
Tengo las tabla Empresas, Ventas, Citas y quiero sacar la siguiente
infomación :

NombreEmpresa Nº Citas Nº Ventas
Empresa1 20 10
Empresa2 10 5

Evidentemente en la columna NombreEmpresa debe aparecer empresas que
tengan solo citas o solo ventas. Muchas Gracias.
Respuesta Responder a este mensaje
#2 Rios
18/07/2005 - 13:07 | Informe spam
Muchas Gracias KEKOS, ha funcionado añadiéndole un pequeño detalle:
En los count del Select es necesario poner DISTINCT, p.e.
COUNT(DISTINCT dbo.CITAS.ID) AS NUMCITAS, ya que en caso de que una
empresa tenga citas y ventas, el Count sin distinct nos da el mismo
número de citas y ventas cuando no es real, ya que cuenta el número
de registros de la tabla en ambos casos.
Gracias de todos modos, ha sido fundamental tu ayuda.

Incidencias KEKOS ha escrito:
Hola:

Me imagino que las tablas citas y ventas estaran relacionadas con la tabla
empresa, porque sino no se podria hacer. Esta es la consulta que deberias
utilizar:

dim sSql as string

sSQl="SELECT EMPRESAS.NOMEMPRESA, Count(CITAS.CODCITA) AS NUMCITAS, " & _
"Count(VENTAS.CODVENTA) AS NUMVENTAS " & _
"FROM (EMPRESAS LEFT JOIN CITAS ON EMPRESAS.NOMEMPRESA > CITAS.NOMEMPRESA) LEFT JOIN " & _
"VENTAS ON EMPRESAS.NOMEMPRESA = VENTAS.NOMEMPRESA " & _
"GROUP BY EMPRESAS.NOMEMPRESA " & _
"HAVING Count(CITAS.CODCITA)>0 OR Count(VENTAS.CPDVENTA)>0 "

Nota: Lo que esta dentro de la instruccion having es para que selgan solo
aquellas empresas que tiene citas o ventas o las dos. Si citas o ventas
serian 0
no saldria en esta consulta.

escribió en el mensaje
news:
Hola, me gustaría realizar una consulta un poco complicada. Os
explico:
Tengo las tabla Empresas, Ventas, Citas y quiero sacar la siguiente
infomación :

NombreEmpresa Nº Citas Nº Ventas
Empresa1 20 10
Empresa2 10 5

Evidentemente en la columna NombreEmpresa debe aparecer empresas que
tengan solo citas o solo ventas. Muchas Gracias.
Respuesta Responder a este mensaje
#3 Alejandro Mesa
18/07/2005 - 15:31 | Informe spam
Como las citas y las ventas no estan relacionadas, es mejor hacer la cuenta
por separado y asi evitamos uniones innecesarias.

select
e.empresa_id,
c.c1 as num_de_citas,
v.c1 as num_de_ventas
from
Empresas as e
left join
(
select
empresa_id,
count(*) as c1
from
Ventas
group by
empresa_id
) as v
left join
on e.empresa_id = v.empresa_id
(
select
empresa_id,
count(*) as c1
from
Citas
group by
empresa_id
) as c
on e.empresa_id = c.empresa_id
go


AMB


"" wrote:

Hola, me gustaría realizar una consulta un poco complicada. Os
explico:
Tengo las tabla Empresas, Ventas, Citas y quiero sacar la siguiente
infomación :

NombreEmpresa Nº Citas Nº Ventas
Empresa1 20 10
Empresa2 10 5

Evidentemente en la columna NombreEmpresa debe aparecer empresas que
tengan solo citas o solo ventas. Muchas Gracias.


Respuesta Responder a este mensaje
#4 Rios
19/07/2005 - 09:46 | Informe spam
Gracias Alejandro, tu consulta ha resultado más rápida en ejecución
que las anteriores. He modificado un left join que le faltaba:
SELECT TOP 100 PERCENT e.ID, e.NOMBRE, ISNULL(c.c1, 0) AS
num_de_citas, ISNULL(v.c1, 0) AS num_de_ventas
FROM dbo.EMPRESAS e LEFT OUTER JOIN
(SELECT ID_CUENTA, COUNT(*) AS c1
FROM CVentaHIST
GROUP BY ID_CUENTA) v ON e.ID = v.ID_CUENTA
LEFT OUTER JOIN
(SELECT id_cuenta, COUNT(*) AS c1
FROM Citas
GROUP BY id_cuenta) c ON e.ID = c.id_cuenta
ORDER BY e.NOMBRE
Respuesta Responder a este mensaje
#5 Alejandro Mesa
19/07/2005 - 15:01 | Informe spam
Rios,

Por que usas "TOP 100 PERCENT"?

Estas usando esta sentencia para crear una vista?, si no, quitalo de la
sentencia pues si vas a seleccionar todo el resultado entonces basta con no
poner esa restriccion. Si estas usando esta sentencia en una vista, entonces
estas mal gastando recursos, porque sql server no garantiza que el resultado
de una sentencia select este ordenado si no usas la clausula "order by", por
lo que cuando selecciones desde la vista tendras que ordernar nuevamente. Si
este resultado lo vas a usar en una aplicacion cliente, entonces te
recomiendo que ordenes la data en la aplicacion y no en el server.


AMB



"Rios" wrote:

Gracias Alejandro, tu consulta ha resultado más rápida en ejecución
que las anteriores. He modificado un left join que le faltaba:
SELECT TOP 100 PERCENT e.ID, e.NOMBRE, ISNULL(c.c1, 0) AS
num_de_citas, ISNULL(v.c1, 0) AS num_de_ventas
FROM dbo.EMPRESAS e LEFT OUTER JOIN
(SELECT ID_CUENTA, COUNT(*) AS c1
FROM CVentaHIST
GROUP BY ID_CUENTA) v ON e.ID = v.ID_CUENTA
LEFT OUTER JOIN
(SELECT id_cuenta, COUNT(*) AS c1
FROM Citas
GROUP BY id_cuenta) c ON e.ID = c.id_cuenta
ORDER BY e.NOMBRE


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida