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

Consulta compleja - ¿¿Es posible??

Estas en el tema de Consulta compleja - ¿¿Es posible?? en el foro de SQL Server en Foros del Web. Hola. Me gustaría saber si es posible (que creo que no) hacer lo siguiente: supongamos que tengo una tabla con la siguiente estructura ID, cAMPO1, ...
  #1 (permalink)  
Antiguo 31/05/2009, 11:22
 
Fecha de Ingreso: marzo-2009
Mensajes: 34
Antigüedad: 15 años, 2 meses
Puntos: 0
Consulta compleja - ¿¿Es posible??

Hola.

Me gustaría saber si es posible (que creo que no) hacer lo siguiente:

supongamos que tengo una tabla con la siguiente estructura

ID, cAMPO1, CAMPO2, CAMPO3, ...., CAMPOn


ID contendrá los siguientes valores por fila (no pongo nada del resto de columnas)

351001
351002
351003
352004
352005
352006
353007
353008
384009
384010
385011
386012

Este campo lo puedo dividir así para el primer registro, por ejemplo: 38 - 1 - 001

Si yo hago un select * from miTabla obtendré estos 12 registros, hasta ahí todo bien.

Supongamos ahora que las columnas son de tipo entero,por tanto puedo obtener un total, pero a mi me interesa obtener varios

totales, de la siguiente forma:

Total tipo 1: Sería la suma de los elementos que corresponden al caracter en la posición 3 y que valen 1, tal que así

351001
351002
351003
suma de estos 3 elementos (*1)

352004
352005
352006
suma de estos 3 elementos (*2)

353007
353008
suma de estos 2 elementos (*3)

384009
384010
suma de estos 2 elementos (*4)

385011
suma de este elemento (*5)

386012
suma de este elemento (*6)


total tipo 2: seria la suma de los elementos (35 y 38) que coincidan con los dos primeros caracteres, tal que así:

351001
351002
351003
352004
352005
352006
353007
353008
suma de estos 8 elementos (*7)

384009
384010
385011
386012
suma de estos 4 elementos (*8)


Como resultado final debería obtener en este orden lo siguiente

351001
351002
351003
(*1)
352004
352005
352006
(*2)
353007
353008
(*3)
384009
384010
(*4)
385011
(*5)
386012
(*6)
(*7)
(*8)

por tanto en lugar de obtener 12 registros, debería obtener 20 registros en total.

Por que todo este follón????, porque hasta ahora yo consultaba la tabla y luego una vez que la tenía, vía codigo obtenía las

sumas que he comentado. El problema viene cuando obtengo, digamos 5000 registros y los quiero mostrar usando un <h:datable en

JSF, que he almacenado en una lista, que consume memoria y en la que dependiendo del número de columnas pues dará error de

memoria.

Hay una técnica llamada lazy-loading para resolver esto, pero necesita tirar del recordset con todos los resultados y me

pregunto si yo podría implementar en el servidor de bases de datos esta operativa para que me devuelva los datos que he

puesto anteriormente y pueda mostrarlo en la página sin problemas.

Bueno, espero haberme explicado.

Gracias.
  #2 (permalink)  
Antiguo 31/05/2009, 17:48
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 9 meses
Puntos: 39
Respuesta: Consulta compleja - ¿¿Es posible??

Lo que te falta es como obtener los totales por cada grupo? Es decir los *1, ... *n
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 01/06/2009, 02:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Consulta compleja - ¿¿Es posible??

Lo primero que deberiamos hacer es poder tratar el ID como un texto para poder acceder a sus distintas partes...

Tenemos las funciones concat() y cast() para convertir integer a texto...

Código sql:
Ver original
  1. SELECT ID, concat(ID) FROM tutabla;

351001 '351001'
...

A partir de esto podemos trabajar como si fuera un string. Con las funciones apropiadas conseguiremos separar lo que nos interesa

LEFT() Return the leftmost number of characters as specified
MID() Return a substring starting from the specified position
SUBSTRING() Return the substring as specified
RIGHT() Return the specified rightmost number of characters

luego

Código sql:
Ver original
  1. SELECT MID(concat(ID),3,1), SUM(campoX)
  2. FROM tutabla
  3. GROUP BY MID(concat(ID),3,1);

esto sumará el valor del campoX para cada valor de la posicion 3 del ID, analogamente

Código sql:
Ver original
  1. SELECT LEFT(concat(ID),2), SUM(campoX)
  2. FROM tutabla
  3. GROUP BY LEFT(concat(ID),2);

esto sumara el campoX para cada valor de las dos primeras posiciones de ID.

Con estos dos resultados y el listado obetenido con


SELECT ID,... FROM TUTABLA

El problema se reduciria a mostrarlos combinados como quieras lo que no creo que te de problemas de memoria....


Obviamente tambien puedes usar

WHERE MID(concat(ID),3,1)=1

para filtrar...

Quim
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 22:37.