PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

ГРУПИРАНЕ ПО или БРОЙ Подобни стойности на полето - UNPIVOT?

Може да съм измислил решение:

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

Трикът работи по следния начин:

  • Трансформирайте типа ред в неговото текстово представяне.
  • Измерете дължината на знаците.
  • Заменете знака, който искате да преброите, и измерете промяната в дължината.
  • Изчислете дължината на оригиналния ред в подизбора за многократна употреба.

Това изисква P, F, I не присъстват никъде другаде в реда. Използвайте подизбор, за да изключите всички други колони, които биха могли да пречат.

Тествано в 8.4 - 9.1. Никой вече не използва PostgreSQL 7.4 в днешно време, ще трябва да тествате сами. Използвам само основни функции, но не съм сигурен дали прехвърлянето на типа ред към текст е възможно в 7.4. Ако това не работи, ще трябва да свържете всички тестови колони веднъж на ръка:

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

Това изисква всички колони да са NOT NULL .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пространствени данни в PostgreSQL

  2. Как да настроите стила на интервала SET (променете изхода на интервала) в PostgreSQL?

  3. PostgREST / PostgreSQL Не може да увеличи съобщението за низов буфер

  4. Присъединете се към 2 комплекта въз основа на реда по подразбиране

  5. как да възстановите postgresql DB без архивиране