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

Sumar filas segun condicion

Estas en el tema de Sumar filas segun condicion en el foro de PostgreSQL en Foros del Web. Saludos tengo un problema con una consulta SQL en PostgreSQL, más precisamente al sumar determinadas filas según cierto criterio. Mi consulta es la siguiente: @import ...
  #1 (permalink)  
Antiguo 15/09/2010, 08:31
Avatar de djmashe  
Fecha de Ingreso: julio-2007
Ubicación: Posadas, Misiones
Mensajes: 52
Antigüedad: 17 años, 4 meses
Puntos: 2
Exclamación Sumar filas segun condicion

Saludos tengo un problema con una consulta SQL en PostgreSQL, más precisamente al sumar determinadas filas según cierto criterio.

Mi consulta es la siguiente:

Código SQL:
Ver original
  1. SELECT denom_ap AS Clases, COUNT(*) AS Total
  2. FROM te02_licencias AS L
  3.  INNER JOIN ta01_clases_por_licencia AS CL ON (L.id_licencia = CL.id_licencia)
  4.  INNER JOIN te03_clases AS C ON (CL.id_clase = C.id_clase)
  5. GROUP BY Clases
  6. ORDER BY Clases;

El cual da como resultado:


Código:
CLASES	TOTAL
--------------
A	16104
AB	23266
ABG	408
AC	2854
ACG	353
AD	2944
ADE	797
ADEG	15				
ADG	102				
AE	2335				
AEG	725				
AG	54				
B	44811				
BG	286				
C	4654				
CG	254				
D	5563				
DE	464				
DEG	88				
DG	27				
E	5542				
EG	272				
F	48				
G	38
Ahora lo que necesito es modificar esta consulta para poder dar como resultado la sumatoria de las clases que tengan tipos en común, o sea, sumar todas las filas que tengan en CLASES la letra “A”, las “B” y las demás todas por separado. O sea, que la salida sea:

Código:
CLASES	TOTAL
--------------
A	49957
B	45097
C	4908
D	6142
E	5814
F	48
G	38
Se que esto se puede hacer con SUM(), pero ¿como puedo hacer para indicar que si en el campo “denom_ap” aparece una A solo sume esos filas, si aparece una B sume las mismas, y así con todas las demás?

Desde ya muchas gracias a quien pueda ayudar…
  #2 (permalink)  
Antiguo 15/09/2010, 09:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Sumar filas segun condicion

prueba esto
Código SQL:
Ver original
  1. SELECT
  2. (
  3.  CASE
  4.  WHEN clases LIKE '%A%'
  5.  THEN 'A'
  6.  WHEN clases LIKE '%B%'
  7.  THEN 'B'
  8.  WHEN clases LIKE '%C%'
  9.  THEN 'C'
  10.  WHEN clases LIKE '%D%'
  11.  THEN 'D'
  12.  WHEN clases LIKE '%E%'
  13.  THEN 'E'
  14.  WHEN clases LIKE '%F%'
  15.  THEN 'F'
  16.  WHEN clases LIKE '%G%'
  17.  THEN 'G'
  18.  ELSE
  19.  'NOTHING'
  20.  END
  21. ) AS clas,
  22. SUM(total) AS suma
  23. FROM
  24. (
  25.  SELECT
  26.  denom_ap AS clases,
  27.  COUNT(*) AS total
  28.  FROM te02_licencias AS L
  29.  INNER JOIN ta01_clases_por_licencia AS CL
  30.  ON (L.id_licencia = CL.id_licencia)
  31.  INNER JOIN te03_clases AS C
  32.  ON (CL.id_clase = C.id_clase)
  33.  GROUP BY Clases
  34. ) AS resultado
  35. GROUP BY clas
  36. ORDER BY clas;

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 15/09/2010, 12:28
Avatar de djmashe  
Fecha de Ingreso: julio-2007
Ubicación: Posadas, Misiones
Mensajes: 52
Antigüedad: 17 años, 4 meses
Puntos: 2
De acuerdo Respuesta: Sumar filas segun condicion

GRACIAS huesos52 funcionó de una!!!!!!

La verdad desconocía que se podía poner una consulta dentro de un FROM en postgres. Donde puedo obtener info de consultas en los FROM y algunos ejemplos?

Por otro lado dejo a continuación como quedó la consulta armada:

Código SQL:
Ver original
  1. SELECT (CASE WHEN clases LIKE '%A%' THEN 'A' WHEN clases LIKE '%B%' THEN 'B'
  2.              WHEN clases LIKE '%C%' THEN 'C' WHEN clases LIKE '%D%' THEN 'D'
  3.              WHEN clases LIKE '%E%' THEN 'E' WHEN clases LIKE '%F%' THEN 'F'
  4.              WHEN clases LIKE '%G%' THEN 'G'
  5.         END) AS Categorias, SUM(total) AS Registros
  6. FROM (SELECT denom_ap AS clases, COUNT(*) AS total
  7.       FROM te02_licencias AS L
  8.        INNER JOIN ta01_clases_por_licencia AS CL ON (L.id_licencia = CL.id_licencia)
  9.        INNER JOIN te03_clases AS C ON (CL.id_clase = C.id_clase)
  10.       GROUP BY Clases) AS resultado
  11. GROUP BY Categorias
  12. ORDER BY Categorias;

Saludos y gracias desde ya.
  #4 (permalink)  
Antiguo 15/09/2010, 12:38
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Sumar filas segun condicion

No te sabría decir una fuente.

Lo unico que tengo para decirte es que el secreto de entender esto, es conceptualizar que en bases de datos relacionales hay que pensar en un plano cartesiano. Cuando haces un SELECT *FROM TABLA; verás que es la misma salida a la que tiene una salida de una consulta compleja con JOIN y funciones varias. Lo que hace postgresql y en general todos los rdbms es manejar estas salidas como tablas cargadas en memoria. fijate que tu consulta inicial la metí entre parentesis y le di un alias. A partir de ese momento, el resultado de esta consulta crea una tabla en memoria que puede ser accedida llamando los parametros de su interior que son nombrados por los alias.

Por ejemplo, mira este ejemplo que dí hace unos pocos dias donde hago inner join con una tabla normal y el resultado de una consulta. Esto es perfectamente valido. Entendiendo esto, ya es cuestión de probar y abrir la mente ante posibles soluciones.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 23/01/2011, 19:27
 
Fecha de Ingreso: enero-2011
Mensajes: 1
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Sumar filas segun condicion

necesito ayuda tengo esta consulta pero necesito sacar el promedio por materia y si es posible el promedio total del alumno
SELECT M.MAE_NOM, MA.MAT_COD, MA.MAT_DES, MA.MAT_TIP, N.NOTA01, N.NOTA02, N.NOTA03, N.NOTA04 FROM materia MA, estudiante E, maestro M, nota N WHERE (M.MAE_COD = E.MAE_COD) AND (N.MAT_COD = MA.MAT_COD) AND (LEC_COD = 3) AND (E.EST_COD = N.EST_COD)AND (CUR_COD = 3) AND (PAR_COD = 1) AND (SEC_COD = 1) group by MA.MAT_COD, MA.MAT_DES order by MA.MAT_COD

esto me sale
MAE_NOM MAT_COD MAT_DES MAT_TIP NOTA01 NOTA02 NOTA03 NOTA04
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 1 MATEMATICA Cuantitativa 19 16 16 15
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 3 INGLES Cuantitativa 20 19 17 12
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 11 CULTURA FISICA Cuantitativa 20 19 19 19
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 20 EDUCACION SEXUAL Cualitativa S S S S
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 22 COMPUTACION Cuantitativa 17 18 15 12
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 24 LENGUAJE Y COMUNICACION Cuantitativa 15 14 16 10
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 28 MUSICA Cuantitativa 19 19 20 18
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 32 ENTORNO NATURAL Y SOCIAL Cuantitativa 20 18 20 20
LLUMIQUINGA ZAMBRANO MATEO GABRIEL 35 CULTURA ESTETICA Cuantitativa 16 18 20 20

Etiquetas: filas
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 07:41.