问题描述
是否有更高效的编写此嵌套查询的方法(查询已大大简化,但基本上字段需要从基表一直构建到所需结果)。
@YearofBookingminus1 是一个声明和计算的变量。这是通过的,对于手头的问题不一定是必需的。我没有添加这个代码。
SELECT fct.ContractNo,Paced_revenue = CASE
WHEN fct.ContractStatus = 'Booked'
AND CYpacing = 'Y' THEN 1
ELSE 0 END
FROM ( SELECT base_fct.ContractNo,CASE
WHEN base_fct.YearofBooking <= @YearofBookingminus1 THEN 'Y'
ELSE 'N' END AS CYpacing
FROM ( SELECT A.DIM_CONTRACT_ID,B.YearofBooking
FROM SchemaA.Contract A
JOIN SchemaB.dim_date B
ON SchemaB.ID BETWEEN SchemaA.StartDate AND SchemaA.EndDate) AS base_fct ) AS fct;
解决方法
这看起来像一个简单的 with 语句
With base_fct as
(
SELECT A.DIM_CONTRACT_ID,B.YearofBooking
FROM SchemaA.Contract A
JOIN SchemaB.dim_date B
ON B.ID BETWEEN A.StartDate AND A.EndDate
),fct as
(
SELECT ContractNo,CASE WHEN YearofBooking <= @YearofBookingminus1 THEN 'Y'
ELSE 'N' END AS CYpacing
FROM base_fct
)
select ContractNo,CASE WHEN ContractStatus = 'Booked' AND CYpacing = 'Y' THEN 1 ELSE 0 END as Paced_revenue
from fct
根据语法,您可能使用的是 postgresql 或 mssql,所以这应该可以工作,但您应该更新以使问题更清楚