2016-01-07 2 views
2

У меня есть услуга подписки, которая предоставляет множество предметов.
Подписчики добавляют предметы к доставке, создавая строку в delivery_items.
До недавнего времени подписчики могли добавлять только 1 из каждого элемента к доставке. Но теперь я добавил колонку количества к моей таблице delivery_items.PostgreSQL сумма количества детских товаров

Предоставлено this schema, and an outdated query (на SQL Fiddle), как я могу выбрать общую сумму элемента, который мне понадобится для доставки каждого дня?

Это обеспечило таблицу дней, и пункты будут доставлены в тот же день, но не учитывает количество:

SELECT 
    d.date, 
    sum((di.item_id = 1)::int) as "Bread", 
    sum((di.item_id = 2)::int) as "Eggs", 
    sum((di.item_id = 3)::int) as "Coffee" 
FROM deliveries d 
JOIN users u ON u.id = d.user_id 
JOIN delivery_items di ON di.delivery_id = d.id 
GROUP BY d.date 
ORDER BY d.date 

В идеале, мой запрос будет агностиком к специфике предметов, как идентификатор/имя.

Благодаря

Изменить, чтобы добавить схему:

deliveries (TABLE) 
id int4(10) 
date timestamp(29) 
user_id int4(10) 
delivery_items (TABLE) 
delivery_id int4(10) 
item_id int4(10) 
quantity int4(10) 
items (TABLE) 
id int4(10) 
name varchar(10) 
users (TABLE) 
id int4(10) 
name varchar(10) 
+0

что-то вроде 'sum (if (item_id = 1, item_quantity, 0)) ... '? суммируйте поле количества или 0, в зависимости от соответствия типа элемента. –

+0

, или, возможно, использовать суб-выбор для агрегирования количества для каждого элемента до объединения. поэтому вместо соединения delivery_items di используйте 'join (выберите sum (item_Quanity), Delivery_ID, Item_ID из группы доставки_items по Delivery_Id, item_ID) DI' – xQbert

ответ

2

Вам не нужно присоединиться к вашему users стола, потому что вы ни получать какие-либо данные из него и не использовать его в качестве вступления условия.

Вот отредактированный SQL Fiddle

Использование условной sum() функции будет получать значения необходимых товаров для доставки на конкретную дату.

SELECT 
    d.date, 
    sum(CASE WHEN di.item_id = 1 THEN di.quantity ELSE 0 END) as "Bread", 
    sum(CASE WHEN di.item_id = 2 THEN di.quantity ELSE 0 END) as "Eggs", 
    sum(CASE WHEN di.item_id = 3 THEN di.quantity ELSE 0 END) as "Coffee" 
FROM deliveries d 
JOIN delivery_items di ON di.delivery_id = d.id 
GROUP BY d.date 
ORDER BY d.date 

Вы также можете посмотреть в crosstab(text, text) функции. Результат будет таким же, но вы также можете указать запрос, который создает набор категорий.

Хотя, если вы хотите, чтобы получить динамические результаты, когда ваш items таблица имеет дополнительные строки, вам нужно будет обернуть это в функции и построить выходные столбцы и определение типов, потому что:

кросс-таблицы функция объявляется возвратом набора записей, поэтому фактические имена и типы выходных столбцов должны быть определены в предложении FROM вызывающего пользователя SELECT

+0

Вы правы в таблице' users'. Он был оставлен из запроса, над которым я работал раньше. Спасибо за демонстрацию условной внутренней суммы. Должно быть полезно – tbeseda

+1

Я включил другой способ достижения этого результата. Вы также можете сделать функцию, чтобы динамически получать категории (элементы). Если вы заинтересованы в том, как это сделать, я также могу помочь вам достичь этого результата позже, так как прямо сейчас я не могу протестировать решение. –

+0

Не возражаете ли вы принять мой ответ или что-то не так с ним? –

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