【发布时间】:2015-12-24 20:00:25
【问题描述】:
我正在编写一个查询来汇总 Postgres 数据库中的数据:
SELECT products.id,
products.NAME,
product_types.type_name AS product_type,
delivery_types.delivery,
products.required_selections,
Count(s.id) AS selections_count,
Sum(CASE
WHEN ss.status = 'WARNING' THEN 1
ELSE 0
END) AS warning_count
FROM products
JOIN product_types
ON product_types.id = products.product_type_id
JOIN delivery_types
ON delivery_types.id = products.delivery_type_id
LEFT JOIN selections_products sp
ON products.id = sp.product_id
LEFT JOIN selections s
ON s.id = sp.selection_id
LEFT JOIN selection_statuses ss
ON ss.id = s.selection_status_id
LEFT JOIN listings l
ON ( s.listing_id = l.id
AND l.local_date_time BETWEEN
To_timestamp('2014/12/01', 'YYYY/mm/DD'
) AND
To_timestamp('2014/12/30', 'YYYY/mm/DD') )
GROUP BY products.id,
product_types.type_name,
delivery_types.delivery
基本上我们有一个带有选择的产品,这些选择有列表,列表有local_date。我需要一份所有产品的清单,以及在这两个日期之间有多少清单。无论我做什么,我都会统计所有选择(总计)。我觉得我忽略了一些东西。 warning_count 也有同样的概念。另外,我不太明白为什么 Postgres 要求我在此处添加 group by。
架构看起来像这样(无论如何你都会关心的部分):
products
name:string
, product_type:fk
, required_selections:integer
, deliver_type:fk
selections_products
product_id:fk
, selection_id:fk
selections
selection_status_id:fk
, listing_id:fk
selection_status
status:string
listing
local_date:datetime
【问题讨论】:
-
您的 Postgres 版本?
count(f)中的f来自哪里?当你写how many listings时,如果同一listing的两个选择包含相同的产品,你是否要计算listing两次?
标签: sql postgresql join left-join aggregate-functions