2015-02-04 2 views
1

У меня есть несколько CTE. CTE1A подсчитывает количество магазинов типа A в области 1. CTE1B подсчитывает количество магазинов типа B в области 1 и т. Д. До CTE1D. Аналогичным образом, CTE2B подсчитывает количество магазинов типа B в области 2 и т. Д. shop_types CTE выбирает все типы магазинов: A, B, C, D. Как отобразить таблицу, которая показывает для каждой области (столбца), сколько магазинов каждого типа есть (строк). Например:объединение результатов CTE

1 2 3 4 5 
A 0 7 4 0 0 
B 2 3 8 2 9 
C 8 5 8 1 6 
D 7 1 5 4 3 

База данных содержит 2 таблицы:

Таблица регионов: shop_id, region_id

Таблица магазины: shop_id, shop_type

WITH 
shop_types AS (SELECT DISTINCT shops.shop_type AS type FROM shops WHERE shops.shop_type!='-9999' AND shops.shop_type!='Other'), 
cte1A AS (
SELECT regions.region_id, COUNT(regions.shop_id) AS shops_number, shops.shop_type 
FROM regions 
RIGHT JOIN shops 
ON shops.shop_id=regions.shop_id 
WHERE regions.region_id=1 
AND shops.shop_type='A' 
GROUP BY shops.shop_type,regions.region_id) 
SELECT * FROM cte1A 
+2

Почему вы используете так много CTE, чтобы считать это? Вероятно, вы можете сделать это с условным подсчетом в одном заявлении. Но вы не предоставили никаких входных данных образца, никаких структур таблиц, и вы также забыли предоставить свой текущий запрос - это делает невозможным ответить. –

+0

Я обновил вопрос. Надеюсь, теперь это яснее. База данных - это то, что я предоставил и не могу ее изменить. Точно так же я получил запросы, написанные так, как они были использованы уже в другом месте, но теперь мне нужно визуализировать результаты в одной таблице, как описано в вопросе. – krltos

+0

Несвязанный, но: ваше внешнее соединение (в 'cte1a') не является внешним соединением, потому что у вас есть условие' where' на внешней объединенной таблице. Вы также не используете первый запрос «shop_types» в запросе. –

ответ

1

Я не совсем уверен, что я понять, почему вы находитесь, но, похоже, вы ищете что-то вроде этого:

select sh.shop_type, 
     count(case when r.region_id = 1 then 1 end) as region_1_count, 
     count(case when r.region_id = 2 then 1 end) as region_2_count, 
     count(case when r.region_id = 3 then 1 end) as region_3_count 
from shops sh 
    left join regions r on r.shop_id = sh.shop_id 
group by sh.shop_type 
order by sh.shop_type; 

Вам нужно добавить заявление case для каждого региона, который вы хотите иметь на выходе.

Если вы используете Postgres 9.4 вы можете заменить операторы регистра, используя filter условие, которое вид делает намерение немного легче понять (я думаю)

count(*) filter (where r.region_id = 1) as region_1_count, 
count(*) filter (where r.region_id = 2) as region_2_count, 
... 

SQLFiddle: http://sqlfiddle.com/#!1/98391/1


И прежде чем вы спросите: нет, вы не можете сделать число столбцов «динамическим» на основе оператора select. Список столбцов для запроса должен быть определен до инструкция фактически выполнена.

+0

Благодарим вас за пояснения и примеры запросов, но я не могу использовать LEFT JOIN, как вы сказали, потому что в таблице магазинов нет region_id. Таблицы связаны с shop_ids. region_id - только в табличных областях. – krltos

+0

@krltos: Я не использую 'region_id' для соединения, я использую' shop_id' (я установил пару минут назад) –

+0

Это именно то, что мне нужно. Не следует думать о том, как использовать готовые запросы, но писать с нуля. – krltos

Смежные вопросы