Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
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 03-12-2009
ingmichel ingmichel is offline
Miembro
 
Registrado: jun 2007
Posts: 137
Poder: 17
ingmichel Va por buen camino
dudas con la clausula group by

hola buenas tardes a todos, mi problema es el siguiente, tengo una tabla can varios campos
entre los k estan cia varchar(50), no_cmunicacion int,status varchar k contiene valores como 'PROCESADA','EN PROCESO','CANCELADA'

tengo registros en mi tabla y requiero sacar la cia, cantidad de comunicaciones, y la cantidad de de comunicaciones cuyo status es 'procesada'
por ejemplo

cia TOTAL_COMUNICACIONES COMUNICACIONES_PROCESADAS
COMPAñIA DE PRUEBA 5 3
compañia x 3 2

y asi sucesivamente



estoy tratandolo de hacer con la clausula group by pero no lo logro hacer:
este es mi codigo


Código SQL [-]
select  naviera_SOLIC,count(DISTINCT NO_COMUNICACION) as total_solicitudes,
COUNT(DISTINCT NO_COMUNICACION)
from MI_VISTA
WHERE STATUS_CM='PROCESADA'
group by naviera_SOLIC

NOTA. MIVISTA ES UNA VISTA QUE TENGO EN MIBD K EXTRAE REGISTROS DE DOS TABLAS MEDIANTE
UN INNER JOIN POR LO CUAL EL NO_COMUNICACION SE PUEDE REPETIR, POR ESO PUSE LA PALABRA DISTINC,
EL PROBLEMA ES K ESTE QUERY ME TRAE LA INFORMACION INDEBIDA
ES DECIR

TOTAL_SOLICTUDE TOTAL_PROCESADAS
4 4

PERO SI CAMBIO EL STATUS A UN REGISTRO X Y LO PONGO EN POR EJEMPLO 'EN PROCESO' Y VUEVO A EJECUTAR EL QUERY ME DEVUELVE LO SIGUIENTE

TOTAL_SOLICTUDE TOTAL_PROCESADAS
3 3

Y LO K DEBERIA DEVOLVER SERIA :

TOTAL_SOLICTUDE TOTAL_PROCESADAS
4 3


ESTOY UTILIZANDO SQL SERVER 2000.

gracias de antemano.
Responder Con Cita
  #2  
Antiguo 03-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Poder: 16
Axel_Tech Va por buen camino
El problema está en que utilizas 2 COUNT en la misma consulta, por lo tanto les afecta el criterio que hay en el WHERE por igual. Es decir te está contando todas las que STATUS_CM='PROCESADA'. Para solucionarlo puedes usar UNION:
Código SQL [-]
select  naviera_SOLIC,count(DISTINCT NO_COMUNICACION) as total_solicitudes
from MI_VISTA
group by naviera_SOLIC
UNION
select  naviera_SOLIC, COUNT(DISTINCT NO_COMUNICACION)
from MI_VISTA
WHERE STATUS_CM='PROCESADA'
group by naviera_SOLIC
por un lado te calcula el total por cada naviera_SOLIC y por otro los que STATUS_CM='PROCESADA'. No se si es eso lo que pides.
__________________
No hope, no dreams, no love, my only escape is Underground
Responder Con Cita
  #3  
Antiguo 03-12-2009
ingmichel ingmichel is offline
Miembro
 
Registrado: jun 2007
Posts: 137
Poder: 17
ingmichel Va por buen camino
El Problema Persiste

HOLA COMPAÑERO GRACIAS POR TU RESPUESTA, REALICE EL QUERY COMO ME INDICASTE UTILIZANDO EL UNION Y ME PERSISTE EL MISMO PROBLEMA, ES DECIR LA CONSULTA ME DEVULVE DOS COLUMNAS QUE SON

NAVIERA_SOLIC TOTAL_SOLICITUDES


PERO LO QUE REQUIERO ES QUE EL QUERY ME DEVUELVA TRES COLUMNAS QUE SON

NAVIERA_SOLIC TOTAL_SOLICITUDES Y TOTAL_PROCESADAS


donde total_solicitudes corresponde al primer count, y el total_procesadas corresponde a aquellas solicitudes que su status_cm sea procesada, NO SE SI ME DOY A ENTENDER, COMO LE HAGO PARA HACER ESTO ?....
Responder Con Cita
  #4  
Antiguo 04-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Poder: 16
Axel_Tech Va por buen camino
Los cálculos de los COUNTS si que los hace bien, sólo que en vez de mostrártelo en columnas te lo muestra en filas o registros
Mmmm... Para obtener la consulta que quieres puedes utilizar 2 consultas diferentes, una para cada COUNT, metiendo el resultado en 2 tablas temporales: en una metes los registros de la consulta de TOTAL_SOLICITUDES y en la otra los registros de la consulta de TOTAL_PROCESADAS.
Luego haces un INNER JOIN entre las 2 uniendo por naviera_SOLIC y saldrá como tú quieres. Sería algo así:
Código SQL [-]
SELECT TABLA_TEMP_1.naviera_SOLIC, TABLA_TEMP_1.TOTAL_SOLICITUDES, TABLA_TEMP_2.TOTAL_PROCESADAS 
FROM TABLA_TEMP_1 INNER JOIN TABLA_TEMP_2 
ON TABLA_TEMP_1.naviera_SOLIC=TABLA_TEMP_2.naviera_SOLIC
__________________
No hope, no dreams, no love, my only escape is Underground
Responder Con Cita
  #5  
Antiguo 04-12-2009
ingmichel ingmichel is offline
Miembro
 
Registrado: jun 2007
Posts: 137
Poder: 17
ingmichel Va por buen camino
exactamente

hola hermano, hice lo k me dijiste con las dos consutas y resultó perfectamente bien, muchas gracias por tu ayuda y k dios te bendiga.






"el conocimiento es un don que crece a medida que se comparte".
Responder Con Cita
  #6  
Antiguo 07-12-2009
ingmichel ingmichel is offline
Miembro
 
Registrado: jun 2007
Posts: 137
Poder: 17
ingmichel Va por buen camino
Nuevo Problema

Hola Como Estas, Aunque Se Resolvio El Problema De Los Count, Ahora Surge Un Problema Nuevo, Se Trata De Que Si Por Ejemplo Hay Una Naviera K No Tiene Status_cm='procesada' El Query Saca A La Naviera Del Grupo, En Lugar De Ponerle Un Cero, Me Explico
Si Por Ejemplo Tengo

Naviera Solic Total_solicitudes, Total_procesadas
Naviera X 9 0


Entones En El Group By No Me Aparece La Naviera X, Es Como Si Para El Query No Existiera, Lo Que Kiero Es K El Query Me Presente La Informacion Aunque No Haya Totales Con Status_cm, Y Que En Lugar De Sacarlo Del Grupo Me Presente A Naviera_solic,total_solicitudes, Y Total_procesadas=0 En Caso De No Tener Ningun Status_cm='procesada', Creo K Esta Un Poco Enrredado...
Responder Con Cita
  #7  
Antiguo 09-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Poder: 16
Axel_Tech Va por buen camino
En ese caso vas a tener que cambiar un poco las consultas. En vez de hacer los COUNT antes de insertarlos en las tablas temporales, hay que hacerlos después. Me explico:

supongo que tienes algo así:
Código SQL [-]
INSERT INTO TABLA_TEMP_1(naviera_SOLIC, total_solicitudes)
select  naviera_SOLIC, count(DISTINCT NO_COMUNICACION) as total_solicitudes
from MI_VISTA
group by naviera_SOLIC

ahora tienes que meter todos los registros en vez de directamente el valor del COUNT:
Código SQL [-]
INSERT INTO TABLA_TEMP_1(naviera_SOLIC, total_solicitudes)
select  naviera_SOLIC, NO_COMUNICACION as total_solicitudes
from MI_VISTA
group by naviera_SOLIC

lo mismo para cuando STATUS_CM='PROCESADA'. Y por último harías los COUNT en las tablas temporales:
Código SQL [-]
SELECT TABLA_TEMP_1.naviera_SOLIC, COUNT(TABLA_TEMP_1.TOTAL_SOLICITUDES), COUNT(TABLA_TEMP_2.TOTAL_PROCESADAS)
FROM TABLA_TEMP_1 LEFT JOIN TABLA_TEMP_2
ON TABLA_TEMP_1.naviera_SOLIC=TABLA_TEMP_2.naviera_SOLIC
GROUP BY TABLA_TEMP_1.naviera_SOLIC

Fíjate que ahora en vez de hacer un INNER JOIN, hacemos un LEFT JOIN, para hacer que el campo por el que cuente sea el de la tabla del lado izquierdo del JOIN, o sea TABLA_TEMP_1. De esa forma los que no existan en TABLA_TEMP_2 los COUNT mostrarán 0.
__________________
No hope, no dreams, no love, my only escape is Underground

Última edición por Axel_Tech fecha: 09-12-2009 a las 14:16:20.
Responder Con Cita
  #8  
Antiguo 09-12-2009
ingmichel ingmichel is offline
Miembro
 
Registrado: jun 2007
Posts: 137
Poder: 17
ingmichel Va por buen camino
Efectivamente

EL PROBLEMA SE SOLUCIONO, REEMPLACE EL INNER JOIN POR UN LEFT JOIN Y CON ESO QUEDO RESUELTO, ENTONCES TAMBIEN PUSE LA FUNCION ISNULL(TOTA_PROCESADAS,0) PARA SI EN CASO NO EXISTA PROCEDAS ME DEVUELVA UN CERO Y ESO ERA TODO, MUCHAS GRACIAS NUEVAMENTE POR TU AYUDA, CUIDATE MUCHO Y HASTA PRONTO HERMANO...


Cita:
Empezado por Axel_Tech Ver Mensaje
En ese caso vas a tener que cambiar un poco las consultas. En vez de hacer los COUNT antes de insertarlos en las tablas temporales, hay que hacerlos después. Me explico:

supongo que tienes algo así:
Código SQL [-]INSERT INTO TABLA_TEMP_1(naviera_SOLIC, total_solicitudes) select naviera_SOLIC, count(DISTINCT NO_COMUNICACION) as total_solicitudes from MI_VISTA group by naviera_SOLIC


ahora tienes que meter todos los registros en vez de directamente el valor del COUNT:
Código SQL [-]INSERT INTO TABLA_TEMP_1(naviera_SOLIC, total_solicitudes) select naviera_SOLIC, NO_COMUNICACION as total_solicitudes from MI_VISTA group by naviera_SOLIC


lo mismo para cuando STATUS_CM='PROCESADA'. Y por último harías los COUNT en las tablas temporales:
Código SQL [-]SELECT TABLA_TEMP_1.naviera_SOLIC, COUNT(TABLA_TEMP_1.TOTAL_SOLICITUDES), COUNT(TABLA_TEMP_2.TOTAL_PROCESADAS) FROM TABLA_TEMP_1 LEFT JOIN TABLA_TEMP_2 ON TABLA_TEMP_1.naviera_SOLIC=TABLA_TEMP_2.naviera_SOLIC GROUP BY TABLA_TEMP_1.naviera_SOLIC


Fíjate que ahora en vez de hacer un INNER JOIN, hacemos un LEFT JOIN, para hacer que el campo por el que cuente sea el de la tabla del lado izquierdo del JOIN, o sea TABLA_TEMP_1. De esa forma los que no existan en TABLA_TEMP_2 los COUNT mostrarán 0.
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
Impresion de group header group footer Manuel Impresión 3 11-11-2007 02:05:23
Clausula Like JoseAntonio SQL 5 27-05-2007 08:28:47
Clausula LIKE federiconqn21 SQL 3 28-12-2005 16:49:13
consultas anidadas: group by dentro otro group by DobleSiete SQL 7 31-01-2005 15:59:31
Group Header, Detail y Footer Group en la misma pagina MarcelRuz Impresión 0 21-04-2004 00:27:14


La franja horaria es GMT +2. Ahora son las 00:28:04.


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