sql >> Database teknologi >  >> RDS >> PostgreSQL

GRUPPER EFTER eller TÆL Som feltværdier - UNPIVOT?

Jeg har muligvis fundet en løsning:

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

Tricket fungerer således:

  • Omdan rækketypen til dens tekstrepræsentation.
  • Mål tegnlængde.
  • Erstat det tegn, du vil tælle, og mål ændringen i længden.
  • Beregn længden af ​​den oprindelige række i undervalget til gentagen brug.

Dette kræver, at P, F, I findes ingen andre steder i rækken. Brug et undervalg til at udelukke andre kolonner, der kan forstyrre.

Testet i 8.4 - 9.1. Ingen bruger PostgreSQL 7.4 længere i dag, du bliver nødt til at teste dig selv. Jeg bruger kun grundlæggende funktioner, men jeg er ikke sikker på, om det er muligt at caste rækketypen til tekst i 7.4. Hvis det ikke virker, bliver du nødt til at sammenkæde alle testkolonner én gang i hånden:

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

Dette kræver, at alle kolonner er NOT NULL .



  1. bedste måde at importere data til mysql

  2. MySQL SELECT id for række, hvor STØRSTE af MAX indgange i flere kolonner

  3. Sjovt med BULK INSERT SQL SERVER - type uoverensstemmelse eller ugyldigt tegn for den angivne tegntabel

  4. Forskellige db til test i Django?