Sql 如何在给定的日期范围内查找列的总和,其中表只有开始日期和结束日期

Sql 如何在给定的日期范围内查找列的总和,其中表只有开始日期和结束日期,sql,postgresql,Sql,Postgresql,我有一个如下的postgresql表: 用户id、开始日期、结束日期、项目id、分发 我需要编写一个查询,其中给定的日期范围和用户id的输出应该是该给定用户每天的所有分发的总和 所以输入的输出应该是这样的:“2-2-2012”-“2-4-2012”,一些用户id: 日期总和(分配) 2-2-2012 12 2012年2月3日15 2012年2月4日34 一个用户在许多项目中都有分布,所以我需要对每天所有项目中的分布进行求和,并输出当天的总和 我的问题是我应该反对什么?如果我有一个字段作为da

我有一个如下的postgresql表:
用户id、开始日期、结束日期、项目id、分发

我需要编写一个查询,其中给定的日期范围和用户id的输出应该是该给定用户每天的所有分发的总和
所以输入的输出应该是这样的:“2-2-2012”-“2-4-2012”,一些用户id:
日期总和(分配)

2-2-2012 12
2012年2月3日15
2012年2月4日34

一个用户在许多项目中都有分布,所以我需要对每天所有项目中的分布进行求和,并输出当天的总和

我的问题是我应该反对什么?如果我有一个字段作为date(而不是start_date和end_date),那么我可以写一些类似于
按日期从userDistributions组中选择日期、总和(分配)
但在这种情况下,我很困惑该怎么办。感谢您的帮助。

用于生成日期,如下所示:

select dt.d::date, sum(u.distributions)
from userdistributions u
join generate_series('2012-02-02'::date, '2012-02-04'::date, '1 day') as dt(d)
  on dt.d::date between u.start_date and u.end_date
group by dt.d::date
您的日期格式不明确,因此我猜在将其转换为ISO 8601时。

用于生成日期,如下所示:

select dt.d::date, sum(u.distributions)
from userdistributions u
join generate_series('2012-02-02'::date, '2012-02-04'::date, '1 day') as dt(d)
  on dt.d::date between u.start_date and u.end_date
group by dt.d::date

您的日期格式不明确,所以我猜在将其转换为ISO 8601时。

这很像@mu的答案。
但是,要覆盖没有匹配项的日期,您应该使用
左连接

SELECT d.d::date, sum(u.distributions) AS dist_sum
FROM   generate_series('2012-02-02'::date, '2012-02-04'::date, '1 day') AS d(d)
LEFT   JOIN userdistributions u ON d.d::date BETWEEN u.start_date AND u.end_date
GROUP  BY 1

这很像@mu的回答。
但是,要覆盖没有匹配项的日期,您应该使用
左连接

SELECT d.d::date, sum(u.distributions) AS dist_sum
FROM   generate_series('2012-02-02'::date, '2012-02-04'::date, '1 day') AS d(d)
LEFT   JOIN userdistributions u ON d.d::date BETWEEN u.start_date AND u.end_date
GROUP  BY 1

您的数据库需要一个日历表。它使这类查询变得更容易。@GordonLinoff:您几乎不需要PostgreSQL中的日历表,
generate_series
更好。您希望看到带有0个项目的日期数据吗?@Mike嗯,这很好,但不是必需的。您的数据库需要一个日历表。它使这类查询变得更容易。@GordonLinoff:您几乎不需要PostgreSQL的日历表,
generate\u series
更好。您希望看到带有0个项目的日期数据吗?@Mike嗯,这很好,但不是必需的。这太棒了,generate_series是postgres专用的还是所有其他DBMS的标准配置?@Rohit:我很确定它是PostgreSQL专用的,但它非常有用,应该是标准配置。@Rohitchauhan它是一个非标准的PostgreSQL函数。这太棒了,generate_series是postgres专用的还是所有其他DBMS的标准配置?@Rohit:我很确定它是PostgreSQL专用的,但它非常有用,因此它确实应该在标准配置中。@Rohitchauhan它是一个非标准的PostgreSQL函数。是的,这可以处理“非常好”的问题显示没有匹配userdistributions记录的日期的情况。是的,这可以处理显示没有匹配userdistributions记录的日期的“非常好”的情况。