SQL - suma condicionada de tabla SQLite

 
Vista:

suma condicionada de tabla SQLite

Publicado por javier (2 intervenciones) el 19/12/2016 17:08:54
Hola amigos, estoy pillado con la consulta a la BD en SQLite. Resulta que tengo unas tablas como las que siguen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Tabla A   :  S1  S2  S3  S4  S5  S6  S7  S8
sus datos:   1   1   1   0   1   3   1   2
             1   2   1   1   1   1   1   0
             .........
 
Tabla B   :  S1  S2  S3  S4  S5  S6  S7  S8
sus datos:   1   2   1   1   1   1   1   2
             1   2   1   1   3   1   1   0
             .............
 
Tabla C   :  S1  S2  S3  S4  S5  S6  S7  S8
sus datos:   1   0   1   0   1   3   1   2
             1   2   1   1   0   1   1   0
             ................
 
Tabla D   :  S1  S2  S3  S4  S5  S6  S7  S8
sus datos:   1   1   1   1   1   1   1   1
             1   2   1   1   1   2   1   1
             ...........

y el resultado que pretendo buscar es contar todo los "1" que tengo en cada tabla, dejando a fuera los 0, 2 y 3.
por ejemplo la TABLA A en su primera fila tiene 5 UNOS y en la segunda fila 6 UNOS esto da un total de 11 UNOS, esto mismo quiero hacerlo en la tabla B,C y D, para luego sumarlos todo y obtener el total de todas las tablas.
A alguien se le ocurre como abordar esto?

Saludos!!
Javier
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

suma condicionada de tabla SQLite

Publicado por xve (284 intervenciones) el 19/12/2016 19:49:54
Hola Javier, no se si es la mejor manera, pero lo que se me ocurre, es que sumes las 8 columnas que tengan como valor el 1... algo así:

1
2
3
4
5
6
7
8
9
SELECT
(select sum(S1) as S1total FROM TablaA WHERE S1=1) s1
(select sum(S2) as S1total FROM TablaA WHERE S2=1) s2
(select sum(S3) as S1total FROM TablaA WHERE S3=1) s3
(select sum(S4) as S1total FROM TablaA WHERE S4=1) s4
(select sum(S5) as S1total FROM TablaA WHERE S5=1) s5
(select sum(S6) as S1total FROM TablaA WHERE S6=1) s6
(select sum(S7) as S1total FROM TablaA WHERE S7=1) s7
(select sum(S8) as S1total FROM TablaA WHERE S8=1) s8

Esto te serviría para sumar una tabla?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

suma condicionada de tabla SQLite

Publicado por javier (2 intervenciones) el 19/12/2016 20:48:22
Hola amigo, gracias por la respuesta, si bien es una forma de poder hacerlo, según lo que indicas, pero estoy viendo alguna otra forma mas compacta por decirlo de alguna modo, aún así agradezco de tu tiempo para contestar el post.

Saludos cordiales
Javier
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

suma condicionada de tabla SQLite

Publicado por leonardo_josue (1173 intervenciones) el 19/12/2016 22:08:33
Hola Javier:

Tratar de "optimizar" la consulta resulta algo complicado sin cambiar el modelo de datos... desde mi punto de vista tienes un mal diseño desde el momento en que tienes muchas tablas con la misma estructura... y con columnas que aparentemente guardan el mismo tipo de dato.

Podrías cambiar tu modelo para tener sólo una tabla con una estructura más o menos así:

Tabla(id int, tipo_tabla varchar(1), tipo_columna varchar(1), valor);

de tal suerte que tu información la almacenes más o menos así:

Tabla
-------------------
1, 'A', 'S1', 1
2, 'A', 'S2', 1
3, 'B', 'S1', 0
4, 'B', 'S2', 1
5, 'C', 'S1', 2
6, 'C', 'S2', 1

Con tu información así, bastaría con hacer un COUNT simple para obtener el dato que necesitas.

Si bien podrías pensar que al tener muchos registros en lugar de muchas columnas es un desperdicio, al verdad es que esto es cientos de veces mejor que como lo estás haciendo. Insisto, si puedes cambiar tu modelo hazlo y evita dolores de cabeza.

Ahora bien, como te comenté, tratar de simplificar la consulta resulta algo complicado, otra forma para obtener lo que quieres en una "sola" consulta sería más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
select
sum(case when S1 = 1 then 1 else 0 end) +
sum(case when S2 = 1 then 1 else 0 end) +
sum(case when S3 = 1 then 1 else 0 end) +
sum(case when S4 = 1 then 1 else 0 end) +
sum(case when S5 = 1 then 1 else 0 end) +
sum(case when S6 = 1 then 1 else 0 end) +
sum(case when S7 = 1 then 1 else 0 end) +
sum(case when S8 = 1 then 1 else 0 end) total_unos
from
(
select * from tabla_a
union all
select * from tabla_b
union all
select * from tabla_c
union all
select * from tabla_d) T;

Compara el rendimiento con las otras consultas y determina cuál es mejor para ti

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar