我正在使用PostgreSQL 9.5。我有两张桌子
EmployeeReportMarch
EmployeeId Bonus Day
---------------------------------
1 10000 23
EmployeeReport20152016
EmployeeId Bonus Month
---------------------------------
1 10000 02
1 10000 03
EmployeeReport
EmployeeId Bonus FiscalYear
---------------------------------
1 100000 20152016
1 90000 20162017
Calendar
Day_Id Day Month FiscalYear
--------------------------------------------
2015-03-21 21 3 20152016
2015-03-22 22 3 20152016
2015-03-23 23 3 20152016
2015-03-24 24 3 20152016
2015-03-25 25 3 20152016
日历表格从“2010-01-01”到“2016-12-31”。 会计年度为4月1日至3月31日。
当我加入两个表格以从
获取数据时SELECT e.EmployeeeId, e.Bonus
FROM Employee e INNER JOIN Calendar c ON e.Day = c.Day
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date;
输出:
EmployeeId Bonus Day_Id
-------------------------------------
1 10000 2015-02-23
1 10000 2015-03-23
SELECT e.EmployeeeId, e.Bonus
FROM Employee e INNER JOIN Calendar c ON e.Month = c.Month
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date;
输出:
EmployeeId Bonus
--------------------
1 100000
1 100000
--59 Rows (2 Month rows)
SELECT e.EmployeeeId, e.Bonus
FROM Employee e INNER JOIN Calendar c ON e.FiscalYear = c.FiscalYear
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date;
输出:
EmployeeId Bonus
--------------------
1 10000
1 10000
--365 Rows
但表格中只剩下一条记录。我也尝试过OUTER JOIN,但结果是一致的任何想法怎么做。
答案 0 :(得分:0)
join组合来自两个表的匹配行。由于employee表中的日期与日期表中的日期匹配两次,在语句之间给出的范围内,这就是输出中两行的原因。我想如果你使用任何连接,它将在输出中给出两行。
答案 1 :(得分:0)
它的架构问题,而不是JOIN声明......
您的表日历中包含主键列@echo off
cd \.
cd \Users\
dir *20**
echo Users to be deleted
pause
@echo on
for /D %%f in (*20**) do rmdir %%f /s /q
pause
exit
,但您尝试按列日加入,这不是唯一的。 Day = 23(每年12个,确切地说)有很多记录。所以,你的桌子每个月会得到1行。
要解决此问题,您应该按列Day_Id(或一次按3列:年+月+日)加入。