[英]Join 2 Tables And Filter Sql Query
我有两张桌子,我需要从两张桌子中占满
表 1 TableMaster
_______________________________
|TableNo | TableType | Shared |
-------------------------------
|1 | WT | FULL |
|2 | WT | FULL |
|3 | WT | SHARED |
|4 | WT | SHARED |
-------------------------------
表 2 TableSharedDetails
______________________________________________
|TableNo | ReservedDate | TableType | Shared |
----------------------------------------------
|4 | 29-12-2016 | WT | FULL |
|4 | 30-12-2016 | WT | FULL |
----------------------------------------------
我的桌长有完整的和共享的桌子。 某个日期的全表占用率为 1,共享表占用率为 2,我们将共享表转换为全表,因为我正在使用表 2 TableSharedDetails。
当我们在该日期将表转换为满表时,我需要增加完整表 + 1 并减少共享表 - 1
现在我想要特定时期的表格类型明智的可用状态,例如(28-12-2016 到 31-12-2016)
输出
______________________________________________
| ReservedDate | TableType | Shared |Totalava|
----------------------------------------------
| 28-12-2016 | WT | FULL | 2 |
| 28-12-2016 | WT | Shared | 2 |
| 29-12-2016 | WT | FULL | 3 |
| 29-12-2016 | WT | Shared | 1 |
| 30-12-2016 | WT | FULL | 3 |
| 30-12-2016 | WT | Shared | 1 |
| 31-12-2016 | WT | FULL | 2 |
| 31-12-2016 | WT | Shared | 2 |
----------------------------------------------
这里的 Totalava 是 tablemaster 的表数
我尝试了一种程序,但它不正确
Create Procedure TableAvaStatus (@StartDate as DateTime, @EndDate as DateTime)
as
declare @AvaStatus table (ReserveDate DateTime, TableType varchar(10), Shared varchar(10), TotalAva int)
While @StartDate < @EndDate
Begin
INSERT INTO @AvaStatus (ReserveDate, TableType, Shared, TotalAva)
SELECT
@StartDate,
TableType,
Shared,
(CASE
WHEN Shared = 'FULL' THEN COUNT(*)
ELSE COUNT(*) END)
+ (SELECT COUNT(*) FROM TableSharedDetails
WHERE Shared = 'FULL'
AND TableType = A.TableType
GROUP BY TableType) AS TotalAva
FROM TableMaster A
End
Select * From @AvaStatus
假设 ReservedDate 的数据类型是Date
。
尝试:
declare @startDate date
declare @endDate date
select @startDate = '2016-12-28'
select @endDate = '2016-12-31'
-- Recursive CTE to generate dates between start and end dates
;with dateRange as
(
select @startDate as dt
union all
select dateadd(dd, 1, dt)
from dateRange
where dateadd(dd, 1, dt) < +dateadd(dd, 1, @endDate)
)
select
tbl_master.dt as ReservedDate,
tbl_master.TableType,
tbl_master.Shared,
case tbl_master.shared
when 'FULL' then
tbl_master.avail+coalesce(tbl_shared.shared_count,0)
when 'SHARED' then
tbl_master.avail-coalesce(tbl_shared.shared_count,0)
else
tbl_master.avail
end as Totalavail
from (
-- Join date range data with `TableMaster` to get table availablity
select dateRange.dt,TableMaster.TableType,TableMaster.Shared,count(*) as avail
from dateRange left join TableMaster on 1=1
group by dateRange.dt,TableMaster.TableType,TableMaster.Shared
) as tbl_master
-- Join `TableSharedDetails` for adding and subtracting counts from table availability
left join (
select ReservedDate,TableType,count(*) as shared_count
from TableSharedDetails
group by ReservedDate,TableType
) tbl_shared on
tbl_master.dt=tbl_shared.ReservedDate
and tbl_master.TableType=tbl_shared.TableType;
SQL小提琴: http ://sqlfiddle.com/#! 6/84458/33
解释:
1- 使用with dateRange
:这是用于在提供给存储过程的开始日期和结束日期之间生成日期的递归 CTE。
2- 生成日期范围后,将范围数据与TableMaster
以获得表格的可用性。 由于没有特定的加入条件,所以我把 1=1(在所有条件下都表示为 True)将所有日期范围数据与TableMaster
结合起来。
3- 获得表可用性后,加入TableSharedDetails
以从 FULL 和共享表数据中添加和减去。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.