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

Заявка за транспониране на кръстосана таблица

Особената трудност е, че вашите данни не са готови за кръстосана таблица. Трябват ви данни във формата име_на_ред , категория , стойност . Можете да го получите с UNION заявка:

SELECT 'metric1' AS metric, country_code, metric1 FROM tbl1
UNION ALL
SELECT 'metric2' AS metric, country_code, metric2 FROM tbl1
UNION ALL
SELECT 'metric3' AS metric, country_code, metric3 FROM tbl1
ORDER  BY 1, 2 DESC;

Но интелигентен LATERAL заявката се нуждае само от сканиране на една таблица и ще бъде по-бърза:

SELECT x.metric, t.country_code, x.val
FROM   tbl1 t
     , LATERAL (VALUES
         ('metric1', metric1)
       , ('metric2', metric2)
       , ('metric3', metric3)
       ) x(metric, val)
ORDER  BY 1, 2 DESC;

Свързани:

Използвайки простата форма на crosstab() с 1 параметър с тази заявка като вход:

SELECT * FROM crosstab(
 $$SELECT x.metric, t.country_code, x.val
   FROM   tbl1 t
        , LATERAL (VALUES
            ('metric1', metric1)
          , ('metric2', metric2)
          , ('metric3', metric3)
          ) x(metric, val)
   ORDER  BY 1, 2 DESC$$
   )
AS ct (metric text, us int, uk int, fr int);

Избройте имената на държавите в азбучен низходящ ред (както във вашата демонстрация). Това също предполага, че всички показатели са дефинирани NOT NULL .

Ако едното или и двете не са, вместо това използвайте формата с 2 параметъра:

Добавяне на „сборен пакет“

т.е. общи суми за показател:

SELECT * FROM crosstab(
 $$SELECT x.metric, t.country_code, x.val
   FROM  (
      TABLE tbl1
      UNION ALL
      SELECT 'zzz_total', sum(metric1)::int, sum(metric2)::int, sum(metric3)::int  -- etc.
      FROM tbl1
      ) t
        , LATERAL (VALUES
            ('metric1', metric1)
          , ('metric2', metric2)
          , ('metric3', metric3)
          ) x(metric, val)
   ORDER  BY 1, 2 DESC$$
   )
AS ct (metric text, total int, us int, uk int, fr int);

'zzz_total' е произволен етикет, който трябва да сортира последния по азбучен ред (или имате нужда от формата с 2 параметъра на crosstab() ).

Ако имате много от колони с показатели, може да искате да изградите динамично низа на заявката. Свързани:

Също така имайте предвид, че предстоящият Postgres 9.5 (понастоящем бета) въвежда специален SQL клауза за ROLLUP .
Свързани:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при създаването на пространствена база данни. ГРЕШКА:не можа да се зареди библиотеката /usr/pgsql-9.1/lib/rtpostgis-2.0.so

  2. Изтриване на PostgreSQL с вътрешно присъединяване

  3. Групово актуализиране на обединена таблица с ActiveRecord update_all и Rails 4

  4. Postgresql SELECT произволен с уникална стойност

  5. Json отговор на postgresql преобразуване на дата и час Java postgresql