Lunes 23 de Diciembre de 2024, 13:26
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Bases de Datos
»
SQL Server
(Moderador:
ElNapster
) »
Consulta compleja - ¿¿Es posible??
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Consulta compleja - ¿¿Es posible?? (Leído 4093 veces)
davisoski
Nuevo Miembro
Mensajes: 7
Consulta compleja - ¿¿Es posible??
«
en:
Domingo 31 de Mayo de 2009, 19:32 »
0
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.
Tweet
arielb
Moderador
Mensajes: 771
Nacionalidad:
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #1 en:
Miércoles 3 de Junio de 2009, 17:02 »
0
Creo que entendí, me parece que si se puede, yo haría la prueba con
Código: SQL
SUBSTRING
(
)
len
(
)
LEFT
(
)
Bueno espero te sirva, ahí nos cuentas como te fue
"Porque de tal manera amó Dios al mundo que dio a su hijo unigénito para que todo aquél que en él crea no se pierda mas tenga vida eterna"
Juan 3:16
http://coder-pa.blogspot.com
davisoski
Nuevo Miembro
Mensajes: 7
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #2 en:
Miércoles 3 de Junio de 2009, 17:51 »
0
Hola.
Lo que comentas es para separar los campos y demás, pero para obtener las filas adicionales que comento, cómo sería, es esa mi principal duda?
Salu2
arielb
Moderador
Mensajes: 771
Nacionalidad:
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #3 en:
Miércoles 3 de Junio de 2009, 18:56 »
0
Bueno usando lo que te comenté lo hice en oracle y me salio, creo que es lo que necesitas
Código: SQL
SELECT
SUM
(
CAMPO1
)
,
SUBSTR
(
TO_CHAR
(
CAMPO1
)
,
1
,
3
)
FROM
PRUEBA2
WHERE
SUBSTR
(
TO_CHAR
(
CAMPO1
)
,
1
,
3
)
=
SUBSTR
(
TO_CHAR
(
CAMPO1
)
,
1
,
3
)
GROUP
BY
SUBSTR
(
TO_CHAR
(
CAMPO1
)
,
1
,
3
)
nos comentas....
"Porque de tal manera amó Dios al mundo que dio a su hijo unigénito para que todo aquél que en él crea no se pierda mas tenga vida eterna"
Juan 3:16
http://coder-pa.blogspot.com
davisoski
Nuevo Miembro
Mensajes: 7
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #4 en:
Jueves 4 de Junio de 2009, 17:12 »
0
Hola.
perdona pero no me expliqué correctamente, esa columna no es la que tengo que sumar, esa columna es para obtener una nueva fila por los grupos
municipio actividad ventas
351001 100
351002 105
351003
352004
352005
352006
353007
353008
384009 200
384010
385011
386012
al final lo que necesito es obtener estas columnas que he puesto + una fila con la suma de las filas que comienzan por 351, otra + con la suma de las filas que comiezan por 352, etc.. luego otra por con la suma de las que empiezan por 384, etc..
es un poco complicado la verdad, no se si me explicado correctamente.
salu2 y gracias
tonybolanyo
Nuevo Miembro
Mensajes: 3
Nacionalidad:
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #5 en:
Viernes 5 de Junio de 2009, 13:32 »
0
Hola,
para "mezclar" los resultados como dices yo utilizaría UNION creando IDs para los totales que puedan ser intercalados entre los resultados iniciales. Por ejemplo, supongamos que quieres sumar los datos del campo1 según las condiciones que dices del ID:
Código: SQL
SELECT
id
,
campo1
FROM
table_1
UNION
SELECT
SUBSTRING
(
CAST
(
id
AS
VARCHAR
)
,
1
,
3
)
+
'999'
,
SUM
(
campo1
)
FROM
table_1
GROUP
BY
SUBSTRING
(
CAST
(
id
AS
VARCHAR
)
,
1
,
3
)
+
'999'
UNION
SELECT
'9'
+
SUBSTRING
(
CAST
(
id
AS
VARCHAR
)
,
1
,
2
)
+
'999'
,
SUM
(
campo1
)
FROM
table_1
GROUP
BY
'9'
+
SUBSTRING
(
CAST
(
id
AS
VARCHAR
)
,
1
,
2
)
+
'999'
ORDER
BY
id
de esta manera los totales tendrían unos IDs ficticios que serían:
*1 - 351999
*2 - 352999
*3 - 353999
*4 - 384999
*5 - 385999
*6 - 386999
*7 - 935999
*8 - 938999
y de esta manera se intercalan en la posición adecuada al ordenar por la columna ID.
Espero te sea de ayuda.
T.
F_Tanori
Moderador
Mensajes: 1919
Nacionalidad:
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #6 en:
Viernes 5 de Junio de 2009, 15:06 »
0
Creo que no capto muy bien lo que se pretende, pero creo que no seria tan necesario que fuera una sola sentencia, he entendido como lo ha puesto
Juez
salvo que en lugar de sumar "campo1" sumarias el deseado, pero la solucion la encontrarias en un SP (procedimiento almacenado), y puedes devolver el resultado deseado en una tabla y despues hacer las consultas sobre esa tabla "nueva"
Tal vez puedas explicarnos de una manera mas grafica, o con algun ejemplo en excel por decir algo...
Saludos
" ExIsTo y A vEcEs PiEnSo "
NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================
davisoski
Nuevo Miembro
Mensajes: 7
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #7 en:
Viernes 5 de Junio de 2009, 16:06 »
0
Hola, de nuevo..
Gracias por el interes.
La opción que comenta juez es bastante aproximada a lo que necesito, aunque la forma que comenta f_tanori también me serviría. Al final lo que necesito es tenerlo en un recordset.
Os envío un fichero excel con un ejemplo real..
Este es más simple que el del primer post, en el que solo necesito separarlo por los dos primeros caracteres del índice, en este caso están 35 y 38, y al final se añaden 3 filas nuevas.
Salu2 y gracias
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
Shiquilla
Miembro MUY activo
Mensajes: 188
Nacionalidad:
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #8 en:
Sábado 6 de Junio de 2009, 12:36 »
0
Hola, podrías también ver la opción de utilizar GROUPING.
Código: SQL
SELECT
Municipio
,
LEFT
(
LTRIM
(
Municipio
)
,
3
)
,
LEFT
(
LTRIM
(
Municipio
)
,
2
)
,
CASE
WHEN
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
3
)
)
=
0
AND
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
2
)
)
=
0
AND
GROUPING
(
Municipio
)
=
0
THEN
'Linea'
WHEN
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
3
)
)
=
0
AND
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
2
)
)
=
0
AND
GROUPING
(
Municipio
)
=
1
THEN
'Total agrupacion LEFT(3)'
WHEN
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
3
)
)
=
1
AND
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
2
)
)
=
0
AND
GROUPING
(
Municipio
)
=
1
THEN
'Total agrupacion LEFT(2)'
ELSE
'Total'
END
,
SUM
(
Total
)
AS
Total
,
SUM
(
residente
)
AS
Residente
,
SUM
(
reside
)
AS
Reside
,
SUM
(
residetrabaja
)
AS
ResideTrabaja
,
SUM
(
resideestudia
)
AS
ResideEstudia
FROM
Tabla
GROUP
BY
LEFT
(
LTRIM
(
Municipio
)
,
2
)
,
LEFT
(
LTRIM
(
Municipio
)
,
3
)
,
Municipio
WITH
ROLLUP
Aquí tienes la consulta que necesitabas, ahora ya sólo queda que la ordenes como quieras.
Saludos,
« §hÿqµïllæ »
davisoski
Nuevo Miembro
Mensajes: 7
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #9 en:
Sábado 6 de Junio de 2009, 16:02 »
0
Hola.
gracias de nuevo por responder, la verdad es que no tenía ni idea de que esto se pudiera hacer (ni siquiera conocía rollup, cube). He probado tu consulta en sql server 2000, pero no me funciona (es bastante compleja), de todas maneras buscando por ahí he encontrado ejemplos que me pueden servir de punto de partida para intentar entender este asunto.
Muchas gracias
salu2
Shiquilla
Miembro MUY activo
Mensajes: 188
Nacionalidad:
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #10 en:
Sábado 6 de Junio de 2009, 17:44 »
0
He modificado la SQL y la he probado con tu hoja excel y me funciona correctamente.
Prueba otra vez porque la que he puesto (esta modificada en el anterior post) la he probado.
Código: SQL
SELECT
Municipio
,
LEFT
(
LTRIM
(
Municipio
)
,
3
)
,
LEFT
(
LTRIM
(
Municipio
)
,
2
)
,
CASE
WHEN
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
3
)
)
=
0
AND
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
2
)
)
=
0
AND
GROUPING
(
Municipio
)
=
0
THEN
'Linea'
WHEN
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
3
)
)
=
0
AND
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
2
)
)
=
0
AND
GROUPING
(
Municipio
)
=
1
THEN
'Total agrupacion LEFT(3)'
WHEN
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
3
)
)
=
1
AND
GROUPING
(
LEFT
(
LTRIM
(
Municipio
)
,
2
)
)
=
0
AND
GROUPING
(
Municipio
)
=
1
THEN
'Total agrupacion LEFT(2)'
ELSE
'Total'
END
,
SUM
(
Total
)
AS
Total
,
SUM
(
residente
)
AS
Residente
,
SUM
(
reside
)
AS
Reside
,
SUM
(
residetrabaja
)
AS
ResideTrabaja
,
SUM
(
resideestudia
)
AS
ResideEstudia
FROM
Tabla
GROUP
BY
LEFT
(
LTRIM
(
Municipio
)
,
2
)
,
LEFT
(
LTRIM
(
Municipio
)
,
3
)
,
Municipio
WITH
ROLLUP
Saludos,
« §hÿqµïllæ »
davisoski
Nuevo Miembro
Mensajes: 7
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #11 en:
Sábado 6 de Junio de 2009, 18:19 »
0
Hola.
pues la verdad es que no se que puede pasar, he copiado tu consulta tal cual y solo le he cambiado el nombre de la tabla por la mía y no va.
Tambien he estado haciendo pruebas sobre esta tabla por si me he equivocado con el nombre y demás pero no se lo que ocurre. Seguramente será que me he equivocado en algo. Seguiré probando a ver si consigo que funcione y ya te comento.
Gracias de nuevo.
salu2
Shiquilla
Miembro MUY activo
Mensajes: 188
Nacionalidad:
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #12 en:
Sábado 6 de Junio de 2009, 18:27 »
0
He puesto todos tus campos a INT, igual por ahi viene el fallo. ¿Cual es el error que te da?
Si eso pasame el script de creación de tu tabla y lo pruebo exactamente como la tienes.
Saludos,
« §hÿqµïllæ »
davisoski
Nuevo Miembro
Mensajes: 7
Re: Consulta compleja - ¿¿Es posible??
«
Respuesta #13 en:
Sábado 6 de Junio de 2009, 19:32 »
0
Ok..
Te adjunto el fichero, espero sea lo que me pides.
Salu2
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Bases de Datos
»
SQL Server
(Moderador:
ElNapster
) »
Consulta compleja - ¿¿Es posible??