PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

GROUP BY ou COUNT Like Field Values ​​- UNPIVOT ?

J'ai peut-être trouvé une solution :

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

L'astuce fonctionne comme ceci :

  • Transformer le type de ligne en sa représentation textuelle.
  • Mesurer la longueur des caractères.
  • Remplacez le caractère que vous souhaitez compter et mesurez le changement de longueur.
  • Calculez la longueur de la ligne d'origine dans la sous-sélection pour une utilisation répétée.

Cela nécessite que P, F, I ne sont présents nulle part ailleurs dans la rangée. Utilisez une sous-sélection pour exclure toute autre colonne susceptible d'interférer.

Testé en 8.4 - 9.1. Personne n'utilise plus PostgreSQL 7.4 de nos jours, vous devrez vous tester. Je n'utilise que des fonctions de base, mais je ne suis pas sûr que la conversion du type de ligne en texte soit faisable en 7.4. Si cela ne fonctionne pas, vous devrez concaténer toutes les colonnes de test une fois à la main :

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

Cela nécessite que toutes les colonnes soient NOT NULL .