PostgreSQL基于两个表获得聚合结果

时间:2017-11-09 17:32:20

标签: postgresql

我有两张桌子,
1. items
2. festival_rents

样本记录: items

id | name   |  rent 
------------------------
1  |  Car   |   100             
2  |  Truck |   150   
3  |  Van   |   200   

样本记录: festival_rents

id | items_id   | start_date | end_date   | rent 
------------------------------------------------
1  |  1         | 2018-07-01 | 2018-07-02 | 200  
2  |  1         | 2018-07-04 | 2018-07-06 | 300
3  |  3         | 2018-07-06 | 2018-07-07 | 400

items包含namerent的项目列表。 items表格中的每个项目都可能包含festival_rents,也可能没有festival_rents。对于start_dateend_date的日期范围,表格festival_rents的每个项目的租金都较高。项目可能有多个festival_rents具有不同的日期范围。但可以肯定的是,属于同一item的多个start_date的日期范围不会发生冲突,所有日期范围都会被隔离。

对于给定的end_dateitems范围,我正在寻找的查询对于festival_rents表中的每个项目,计算总租金并显示每个项目它计算了总租金。如果items festival_rents中的任何start_date属于给定的end_datestart_date=2018-07-01,则每个项目的租金计算也应包括end_date=2018-07-06

预期结果:

输入:id | name | total_price ------------------------ 1 | Car | 1100 // 1st 2 days festival rent + 1 day normal rent + last 3 days festival rent (2 * 200) + (1 * 100) + (3 * 200) 2 | Truck | 900 // 6 days normal rent (6 * 150) 3 | Van | 1400 // 5 days normal rent + 1 day festival rent (200 * 5) + (400 * 1) document.cookie = name + "=; path=/; domain=.MYDOMAIN"; expires=Thu, 01 Jan 1970 00:00:01 GMT;";

输出:

$poets['keyboard']

1 个答案:

答案 0 :(得分:0)

您需要在桌面上列出日期或动态创建:

How to get list of dates between two dates in mysql select query

Generating time series between two dates in PostgreSQL

function coursesToFind {
local courseToSearch=$1
grep $1 courses.list > tmp
local linesNumber=$(wc -l tmp | cut -f1)
for((i = 0; i<$linesNumber; i++)); do
local arrToSearchIn=$(grep $courseToSearch courses.list | head -n+1 |  tail -1)
if (($arrToSearchIn==$courseToSearch)) ; then
break
fi
done
for((i=$linesNumber; i>2 ;i--)); do
if (($arrToSearchIn[i]==*[0-9]*[0-9]*[0-9]*[0-9]*[0-9]*[0-9])) ; then
coursesArray[n]=$(arr[i])
n++
coursesToFind $(arr[i])
fi
done
}

我假设end_date是开放范围。因此,如果您有范围SELECT i.name, SUM (f.rent) FROM allDays a JOIN festival_rents f ON a.day >= f.start_date AND a.day < f.end_date JOIN items i ON f.item_id = i.item_id WHERE a.day BETWEEN @start_date AND @end_date GROUP BY i.name [A,B),则日期B将从[B,C)获得租金