Oracle运行时按输入年份展示不重复数据(含设施与预订表)
Oracle:按指定年份查询不重复关联数据解决方案
针对你需要在Oracle环境中根据输入年份展示不重复相关数据的需求,结合你给出的设施表和预订表结构及样本数据,我整理了几种实用的SQL实现方案:
先明确表结构与样本数据
设施表(FacilityTable)
| FACILITYNO | FACILITYNAME |
|---|---|
| FACNO01 | 卫生间 |
| FACNO02 | 员工办公室 |
| FACNO03 | 校长办公室 |
| FACNO04 | 科学实验室 |
| FACNO05 | 数学实验室 |
| FACNO06 | 计算机实验室 |
| FACNO07 | 生物实验室 |
| FACNO08 | 化学实验室 |
预订表(BookingTable)
| FACILITYNO | bookingID | userID | Timebooked |
|---|---|---|---|
| FACNO01 | 1 | 0003 | 10-May-2016 |
| FACNO04 | 2 | 0001 | 10-May-2018 |
| FACNO05 | 3 | 0001 | 10-Apr-2017 |
| FACNO01 | 4 | 0001 | 10-Apr-2017 |
| FACNO02 | 5 | 0003 | 10-Jan-2011 |
| FACNO04 | 6 | 0006 | 10-Apr-2018 |
| FACNO06 | 7 | 0003 | 10-Apr-2016 |
| FACNO07 | 8 | 0006 | 10-Apr-2015 |
具体解决方案
1. 获取指定年份有预订的不重复设施
如果你的需求是找出某一年被预订过的所有设施,且同一个设施不管被预订多少次只显示一次,用这个SQL:
SELECT DISTINCT f.FACILITYNO, f.FACILITYNAME FROM FacilityTable f JOIN BookingTable b ON f.FACILITYNO = b.FACILITYNO WHERE EXTRACT(YEAR FROM b.Timebooked) = :input_year;
关键点说明:
:input_year是你要查询的年份参数,实际使用时可以换成具体数值(比如=2017),或者用Oracle绑定变量来传入DISTINCT用来过滤重复的设施记录,避免同一个设施因多次预订重复出现JOIN只保留有对应预订记录的设施,如果你要包含所有设施(不管有没有预订),可以看下面的方案3
2. 按「设施+用户」维度获取不重复预订记录
如果需要统计某一年里,哪些用户预订了哪些设施(同一个用户同一年预订同一个设施只算一次),可以用:
SELECT DISTINCT b.FACILITYNO, f.FACILITYNAME, b.userID FROM FacilityTable f JOIN BookingTable b ON f.FACILITYNO = b.FACILITYNO WHERE EXTRACT(YEAR FROM b.Timebooked) = :input_year;
要是还想顺便统计每个用户对每个设施的预订次数,用GROUP BY会更灵活:
SELECT b.FACILITYNO, f.FACILITYNAME, b.userID, COUNT(b.bookingID) AS 年度预订次数 FROM FacilityTable f JOIN BookingTable b ON f.FACILITYNO = b.FACILITYNO WHERE EXTRACT(YEAR FROM b.Timebooked) = :input_year GROUP BY b.FACILITYNO, f.FACILITYNAME, b.userID;
3. 展示所有设施的年度预订状态
如果需要列出所有设施,同时标记该年份是否有过预订记录,用左连接+EXISTS子句:
SELECT f.FACILITYNO, f.FACILITYNAME, CASE WHEN EXISTS ( SELECT 1 FROM BookingTable b WHERE b.FACILITYNO = f.FACILITYNO AND EXTRACT(YEAR FROM b.Timebooked) = :input_year ) THEN '已预订' ELSE '未预订' END AS 年度预订状态 FROM FacilityTable f;
内容的提问来源于stack exchange,提问作者whalesboy
相关产品推荐
相关产品推荐

