【发布时间】:2015-11-04 05:56:29
【问题描述】:
尝试创建报告以查看存储单元在 1 个租约和另一个租约之间的空置时间。信息存储在客户表的列中:
PK (Customer Code) | Storage_Number (FK) | Status | startdate | enddate
我得到了基本代码来查找每单位的 MAX(最后一个)客户和之前的 1 个客户。我的问题是当前空置的存储单元。它将显示 New Customer Start Date 过去的客户,而我希望将此字段显示为空白,并且 Prior Customer End Date 应该来自最近的客户。
Select s.PK [Storage Number],
ca.enddate [Prior Customer End Date],
cb.startdate [New Customer Start Date],
Datediff(DAY, ca.enddate, cb.startdate)-1 [Days Vacant]
From Storage s
Left Outer Join (
Select Storage_Number,
MAX(PK) Customer_Code
FROM Customer
WHERE Status in (‘Future’, ‘Active’, ’Past’)
Group By Storage_Number
)maxa On maxa.Storage_Number = s.PK
Left Outer Join(
Select Storage_Number,
MAX(PK) Customer_Code
FROM Customer b
Full Outer Join (
Select Storage_Number sn,
MAX(PK) cc
FROM Customer
WHERE Status in (‘Future’, ‘Active’, ’Past’)
Group By Storage_Number
)a on a.sn = b.Storage_Number
WHERE Status in (‘Future’, ‘Active’, ’Past’)
And b.PK != a.cc
Group by Storage_Number
)maxb
ON maxb.Storage_Number = s.PK
Left Outer Join Customer ca on ca.Storage_Number = s.PK and ca.PK = maxb.PK
Left Outer Join Customer cb on cb.Storage_Number = s.PK and cb.PK = maxa.PK
WHERE ca.enddate !> cb.startdate
Order By ca.enddate
我可以添加多个CASE 语句
Select s.PK [Storage Number],
CASE
WHEN cb.status = ‘Past’
THEN cb.enddate
Else ca.enddate
END [Prior Customer End Date],
CASE
WHEN cb.status = ‘Past’
THEN null
ELSE cb.startdate
END [New Customer Start Date],
CASE
WHEN cb.status = ‘Past’
THEN null
ELSE Datediff(DAY, ca.enddate, cb.startdate)-1
END [Days Vacant]
FROM ………..
但是我想看看是否有更好的方法来做到这一点。
【问题讨论】:
-
看看我对这个问题的解决方案:我怀疑它会对你的问题有所帮助:stackoverflow.com/questions/31735333/…
-
你能展示一些实际数据和预期结果吗,最好的情况是小提琴?这似乎是像 ROW_NUMBER 这样的窗口聚合函数的任务。您的 SQL Server 版本是什么?
-
@JohnLBevan 我没有 2014 年。不确定我有什么版本。我正在开发 RDP 到 3'rd 方数据库,我在哪里检查版本?
-
试试
Select @@version -
发行版:SQL Server 2000 RTM。版本:8.00.194
标签: sql sql-server tsql sql-server-2000