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

Generar Resumen.

Estas en el tema de Generar Resumen. en el foro de SQL Server en Foros del Web. Hola a todos los foreros, tengo la siguiente pregunta para ustedes espero y me puedan ayudar. Tengo una tabla la cual contiene cuatro campos, algo ...
  #1 (permalink)  
Antiguo 24/07/2006, 11:22
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 4 meses
Puntos: 0
Exclamación Generar Resumen.

Hola a todos los foreros, tengo la siguiente pregunta para ustedes espero y me puedan ayudar.

Tengo una tabla la cual contiene cuatro campos, algo así:

Campo1 Campo2 Campo3 Campo4

A 3 12345678 3
B 2 12345678 1
C 5 13456789 5

D 3 98765432 8
E 6 98765432 1
F 1 98765432 5

Ahora mi pregunta es como puedo hacer un resumen de estos registros en base a la llave la cual es el Campo3 y que solo me muestre el registro que en el campo2 contenga el valor mas pequeño y que ademas sume todos los valores del Campo 4 para obtener el siguiente resultado:

B 2 12345678 9

F 1 98765432 14

Espero haberme explicado lo suficiente. Saludos. Y gracias por su ayuda.
__________________
Hasta la victoria Siempre.

Última edición por Cuezaltzin; 25/07/2006 a las 09:01
  #2 (permalink)  
Antiguo 25/07/2006, 16:43
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Creo que esto lo hará:
SELECT t1.campo1, t2.campo2, t1.campo3, sum(t1.campo4)
FROM tabla t1
INNER JOIN (SELECT campo1, campo3, min(campo2) AS campo2 FROM tabla GROUP BY campo1, campo3) t2
ON t1.campo1 = t2.campo1
AND t2.campo3 = t3.campo3
GROUP BY t1.campo1, t2.campo2, t1.campo3
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 25/07/2006, 17:43
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 4 meses
Puntos: 0
Que tal Mithrandir, gracias por tu ayuda.

Pues sigo en las mismas sin poder resolver este latoso query. Con la solución que tu me sugeriste arroja todos los registros existentes de mi tabla.

Hasta ahorita lo que pude arreglar es que muestre Campo2,Campo3 y la suma pero me sigue fallando el como mostrar el campo1, esto es lo que tengo:

SELECT t2.campo2, t1.campo3, sum(t1.campo4) Total
FROM table1 t1
INNER JOIN (SELECT /*campo1,*/ campo3, min(campo2) AS campo2 FROM table1 GROUP BY /*campo1,*/ campo3) t2
ON /*t1.campo1 = t2.campo1
AND */t2.campo3 = t1.campo3
GROUP BY t2.campo2, t1.campo3

Y pues solo para preguntar cual crees que podria ser una solución para este query. Gracias.
__________________
Hasta la victoria Siempre.
  #4 (permalink)  
Antiguo 26/07/2006, 15:12
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Esto me funcionó:
Código:
CREATE TABLE #tabla (campo1 nchar(1), campo2 int, campo3 int, campo4 int, CONSTRAINT jeje PRIMARY KEY(campo1, campo3))

INSERT INTO #tabla VALUES ('A', 3, 12345678 , 3)
INSERT INTO #tabla VALUES ('B', 2, 12345678 , 1)
INSERT INTO #tabla VALUES ('C', 5, 13456789 , 5)
INSERT INTO #tabla VALUES ('D', 3, 98765432 , 8)
INSERT INTO #tabla VALUES ('E', 6, 98765432 , 1)
INSERT INTO #tabla VALUES ('F', 1, 98765432 , 5)

SELECT t1.campo1, t2.campo2, t1.campo3, sum(t1.campo4) Total
FROM #tabla t1
INNER JOIN (SELECT campo3, min(campo2) AS campo2 FROM #tabla GROUP BY campo3) t2
	ON t2.campo3 = t1.campo3
	AND t2.campo2 = t1.campo2
GROUP BY t1.campo1,t2.campo2, t1.campo3

DROP TABLE #tabla
Pero si lo revisas tiene una debilidad, dependes de que solo haya un valor de campo2 por grupo de registros, si se repite dentro de ese grupo se te duplicará el registro de ese grupo.

PD. Dices que la llave primaria es campo3, pero según los ejemplos que pones eso no es cierto, en el ejemplo asumo que entre campo1 y campo3 hacen la llave primaria, cosa que complica el asunto. Si puedes aclarar eso quizá pueda salir una mejor solución.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #5 (permalink)  
Antiguo 26/07/2006, 15:33
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 4 meses
Puntos: 0
Gracias de nuevo Mithrandir por la ayuda.

Con respecto a tu pregunta si el campo3 es la llave primaria es en efecto, pero creo que tuve un pequeño error al ingresar ese dato ya que solo deben existir estas dos llaves (12345678 y 98765432).

Y con respecto a la debilidad que me comentas, pues es en efecto puede llegar a duplicarse el valor en el campo2.

Como crees que pueda llegar a solucuionar este dilema, muchas gracias por tu ayuda. Saludos.
__________________
Hasta la victoria Siempre.
  #6 (permalink)  
Antiguo 27/07/2006, 14:38
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Sigo sin estar claro.

Si solo permites esos 2 valores en ese campo y ese es tu única llave primaria eso significa que SOLO puedes tener 2 registros en esa tabla. No hay de otra.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #7 (permalink)  
Antiguo 27/07/2006, 15:57
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 4 meses
Puntos: 0
Que tal Mithrandir.

Pues digamos que esa no es una llave primaria si no lo que estoy tratando de hacer es agrupar los registros por medio del Campo 3, para que solo mostar un solo registro.

CREATE TABLE #tabla (campo1 nchar(1), campo2 int, campo3 int, campo4 int)

INSERT INTO #tabla VALUES ('A', 1, 12345678 , 3)
INSERT INTO #tabla VALUES ('B', 1, 12345678 , 1)
INSERT INTO #tabla VALUES ('C', 2, 12345678 , 5)
INSERT INTO #tabla VALUES ('D', 3, 98765432 , 8)
INSERT INTO #tabla VALUES ('E', 4, 98765432 , 1)
INSERT INTO #tabla VALUES ('F', 5, 98765432 , 5)

Y pues lo que quiero hacer es mostrar la primera ocurrencia que se encuentre:

A 1 12345678 9
D 3 98765432 14

Saludos y gracias por la paciencia y ayuda.
__________________
Hasta la victoria Siempre.
  #8 (permalink)  
Antiguo 28/07/2006, 15:26
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Juas, ya me la cambiaste de nuevo. Elegir el primer registro no es lo que veníamos manejando ("primero" puede ser diferente de "más pequeño").

Ten en cuenta que en SQL Server no existe el concepto de "primera ocurrencia" pues siempre necesitas un parámetro sobre el cual ordenar y obtener ese primero, puede ser un ID, una fecha, orden afabético, etc. pero siempre tienes que tener ese "algo".

Revisando parece que tu llave primaria real (de la tabla) es campo1, pues empezando porque está en primer lugar y luego en que no se repite en estos ejemplos. Si eso es cierto esto hace el trabajo:
Código:
CREATE TABLE #tabla (campo1 nchar(1), campo2 int, campo3 int, campo4 int)

INSERT INTO #tabla VALUES ('A', 1, 12345678 , 3)
INSERT INTO #tabla VALUES ('B', 1, 12345678 , 1)
INSERT INTO #tabla VALUES ('C', 2, 12345678 , 5)
INSERT INTO #tabla VALUES ('D', 3, 98765432 , 8)
INSERT INTO #tabla VALUES ('E', 4, 98765432 , 1)
INSERT INTO #tabla VALUES ('F', 5, 98765432 , 5)

select t1.campo1, t1.campo2, t1.campo3, t2.campo4
FROM #tabla t1
	INNER JOIN (SELECT min(campo1) AS campo1, campo3, sum(campo4) as campo4 FROM #tabla GROUP BY campo3) t2
		ON t1.campo1 = t2.campo1

DROP TABLE #tabla
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
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 03:23.