2016-10-14 2 views
0

Я пытаюсь запустить sql-запрос в Postgres, который требует кросс-таблицы. Я никогда не использовал кросс-таблицы. Мои 3 таблицы приведены ниже:Postgres Crosstab Query To Count Statuses per City

места ТАБЛИЦА:

LOCATION_ID, lang_id, путь

crm_statuses ТАБЛИЦА:

crm_status_id, crm_status_name

store_crm ТАБЛИЦА:

store_crm_id, статус (ссылки в crm_status_id таблицы crm_statuses), LOCATION_ID (ссылки в LOCATION_ID таблицы местоположений)

Я хочу, чтобы получить места в качестве столбцов из таблицы местоположений путем присоединения к таблице store_crm или, по крайней мере, чтобы написать их жестко закодированные, поскольку им всего 3 (Лондон, Манчестер, Лидс). В качестве строк я хочу получить статус crm. В качестве контента я хочу подсчитать, сколько активных, неактивных и ожидающих магазинов в каждом месте. Активные, неактивные, ожидающие рассмотрения - это мои crm_statuses. Таблица желаемых результатов будет иметь следующий формат.

Status London Manchester Leeds 
Active 2  4   5 
Inactive 6  1   3 
Pending 4  4   5 

Как я могу это достичь?

+0

вы не должны» t используйте кросс-таблицу для отображения таблицы. Его легко достичь с помощью простой петли в php. –

+0

Я должен сделать это в кросс-таблице, потому что он будет выполнен в системе отчетов. –

ответ

0

Вы можете жёстко города, как столбцы в следующем запросе:

SELECT 
    * 
FROM crosstab(' 
     SELECT 
      cs.crm_status_name, 
      l.path, 
      COUNT(*) 
     FROM store_crm AS sc 
     JOIN locations AS l ON (sc.location_id=l.location_id) 
     JOIN crm_statuses AS cs ON (cs.crm_status_id=sc.status) 
     GROUP BY cs.crm_status_name, l.path 
     ORDER BY 1,2 
    ', 
    ' 
     SELECT 
      path 
     FROM 
      locations 
    ') AS f("Status" text, "London" text, "Manchester" text, "Leeds" text); 

с результатом:

Status | London | Manchester | Leeds 
----------+--------+------------+------- 
Active | 1  | 2   | 1 
Inactive | 2  | 1   | 4 
Pending |  | 1   | 1 
(3 rows) 

Если у вас есть схемы базы данных так:

test=# \d+ locations 
                Table "public.locations" 
    Column | Type |       Modifiers       | Storage | Stats target | Description 
-------------+---------+-----------------------------------------------------------------+----------+--------------+------------- 
location_id | integer | not null default nextval('locations_location_id_seq'::regclass) | plain |    | 
lang_id  | integer |                 | plain |    | 
path  | text |                 | extended |    | 
Indexes: 
    "locations_pkey" PRIMARY KEY, btree (location_id) 
Referenced by: 
    TABLE "store_crm" CONSTRAINT "store_crm_location_id_fkey" FOREIGN KEY (location_id) REFERENCES locations(location_id) 

test=# \d+ crm_statuses 
                 Table "public.crm_statuses" 
    Column  | Type |        Modifiers        | Storage | Stats target | Description 
-----------------+---------+----------------------------------------------------------------------+----------+--------------+------------- 
crm_status_id | integer | not null default nextval('crm_statuses_crm_status_id_seq'::regclass) | plain |    | 
crm_status_name | text |                  | extended |    | 
Indexes: 
    "crm_statuses_pkey" PRIMARY KEY, btree (crm_status_id) 
Referenced by: 
    TABLE "store_crm" CONSTRAINT "store_crm_status_fkey" FOREIGN KEY (status) REFERENCES crm_statuses(crm_status_id) 

test=# \d+ store_crm 
                Table "public.store_crm" 
    Column | Type |       Modifiers        | Storage | Stats target | Description 
--------------+---------+------------------------------------------------------------------+---------+--------------+------------- 
store_crm_id | integer | not null default nextval('store_crm_store_crm_id_seq'::regclass) | plain |    | 
status  | integer |                 | plain |    | 
location_id | integer |                 | plain |    | 
Indexes: 
    "store_crm_pkey" PRIMARY KEY, btree (store_crm_id) 
Foreign-key constraints: 
    "store_crm_location_id_fkey" FOREIGN KEY (location_id) REFERENCES locations(location_id) 
    "store_crm_status_fkey" FOREIGN KEY (status) REFERENCES crm_statuses(crm_status_id)