繁体   English   中英

加入 2 个表并过滤 Sql 查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM