sql >> Base de Datos >  >> RDS >> PostgreSQL

GROUP BY o COUNT Valores de campo similares - UNPIVOT?

Puede que se me haya ocurrido una solución:

SELECT id
      ,l - length(replace(t, 'P', '')) AS nr_p
      ,l - length(replace(t, 'F', '')) AS nr_f
      ,l - length(replace(t, 'I', '')) AS nr_i
FROM   (SELECT id, test::text AS t, length(test::text) AS l  FROM test) t

El truco funciona así:

  • Transforme el tipo de fila en su representación de texto.
  • Mide la longitud de los caracteres.
  • Reemplace el carácter que desea contar y mida el cambio de longitud.
  • Calcule la longitud de la fila original en la subselección para uso repetido.

Esto requiere que P, F, I no están presentes en ningún otro lugar de la fila. Utilice una subselección para excluir cualquier otra columna que pueda interferir.

Probado en 8.4 - 9.1. Ya nadie usa PostgreSQL 7.4 hoy en día, tendrá que probarlo usted mismo. Solo uso funciones básicas, pero no estoy seguro de si convertir el tipo de fila en texto es factible en 7.4. Si eso no funciona, tendrá que concatenar todas las columnas de prueba una vez a mano:

SELECT id
      ,length(t) - length(replace(t, 'P', '')) AS nr_p
      ,length(t) - length(replace(t, 'F', '')) AS nr_f
      ,length(t) - length(replace(t, 'I', '')) AS nr_i
FROM   (SELECT id, test1||test2||test3||test4 AS t FROM test) t

Esto requiere que todas las columnas sean NOT NULL .