Sql server 它位于?什么数据类型[Savings(%)]?(我还建议不要使用需要引号标识的名称)。为什么要将WHERE子句放在outquery中而不是子查询中?尝试直接筛选主查询,如:((Calcs.MinStdRate-D.[Quoted Rate]))/NULLI
Sql server 它位于?什么数据类型[Savings(%)]?(我还建议不要使用需要引号标识的名称)。为什么要将WHERE子句放在outquery中而不是子查询中?尝试直接筛选主查询,如:((Calcs.MinStdRate-D.[Quoted Rate]))/NULLI,sql-server,where-clause,Sql Server,Where Clause,它位于?什么数据类型[Savings(%)]?(我还建议不要使用需要引号标识的名称)。为什么要将WHERE子句放在outquery中而不是子查询中?尝试直接筛选主查询,如:((Calcs.MinStdRate-D.[Quoted Rate]))/NULLIF(D.[Quoted Rate],0)>=0.1。另一种方法是创建一个计算的持久列并对其进行筛选。[Savings(%)]是一个十进制(18,2),通常我不会使用括号,但这是报表的最终输出。我使用多个子查询填充主查询(子查询包含外部查询中WH
它位于?什么数据类型
[Savings(%)]
?(我还建议不要使用需要引号标识的名称)。为什么要将WHERE子句放在outquery中而不是子查询中?尝试直接筛选主查询,如:((Calcs.MinStdRate-D.[Quoted Rate]))/NULLIF(D.[Quoted Rate],0)>=0.1。另一种方法是创建一个计算的持久列并对其进行筛选。[Savings(%)]是一个十进制(18,2),通常我不会使用括号,但这是报表的最终输出。我使用多个子查询填充主查询(子查询包含外部查询中WHERE所需的计算)。也许我误解了,但我认为通过将(-(Calcs.MinStdRate-D[引用率])/NULLIF(D[引用率],0)>=0.1移动到SELECT语句,我创建了一个静态列,可以在WHERE子句中进行筛选,正如您所建议的那样。奇怪的是它不是;你能得到执行查询计划并将其粘贴到吗?我更新了它以包含整个查询,尽管不完全确定它是否相关。这可能不是最有效的方法,但我已经有了一些细节。我最初的想法更像是你在索引方面所说的,尽管由于查询从未完全运行,我不认为我能够看到执行计划?其中大多数都是由第三方软件提供商策划的表,我以前从未遇到过索引问题。如果整个查询运行时没有WHERE语句,那么这不太可能吗?谢谢您的更新。我可以看到一个相当复杂的UNION查询,主要问题是[Savings(%)]
是一个计算字段。因此,优化器无法快速删除不必要的记录。(与[当前速率]相反,不必要的记录可以很快删除)。这意味着,必须计算所有行,然后才能对它们进行过滤。这需要花费大量的时间。PS:您是否尝试在夜间运行查询?也许你会得到执行计划,它修正了它,把它放到一个表中,然后从那里查询。谢谢你的帮助。我需要花更多的时间研究执行计划策略。这看起来很奇怪,但可能不是。我更新了整个查询,虽然不完全确定它是否相关。这可能不是最有效的方法,但我已经有了一些细节。我最初的想法更像是你在索引方面所说的,尽管由于查询从未完全运行,我不认为我能够看到执行计划?其中大多数都是由第三方软件提供商策划的表,我以前从未遇到过索引问题。如果整个查询运行时没有WHERE语句,那么这不太可能吗?谢谢您的更新。我可以看到一个相当复杂的UNION查询,主要问题是[Savings(%)]
是一个计算字段。因此,优化器无法快速删除不必要的记录。(与[当前速率]相反,不必要的记录可以很快删除)。这意味着,必须计算所有行,然后才能对它们进行过滤。这需要花费大量的时间。PS:您是否尝试在夜间运行查询?也许你会得到执行计划,它修正了它,把它放到一个表中,然后从那里查询。谢谢你的帮助。我需要花更多的时间研究执行计划策略。这看起来很奇怪,但也许不是。
WHERE sub.[Savings (%)] >= 10
SELECT *
FROM
(
SELECT
LD.Region
,DM.ShortName AS DM
,D.Lcode
,LD.locationname
,D.UnitID
,D.dPlaced
,D.dCancelled
,D.sRentalType
,D.[Quoted Rate]
,Calcs.MinStdRate AS [Current Rate]
,-(Calcs.MinStdRate - D.[Quoted Rate]) AS [Savings ($)]
,((-(Calcs.MinStdRate - D.[Quoted Rate]))/NULLIF(D.[Quoted Rate],0))*100 AS [Savings (%)]
,D.sPlanName
,Calcs.[# Vacant]
FROM...
) AS sub
WHERE sub.[Savings (%)] >= 10
AND sub.[Current Rate] <> 0
AND sub.[Quoted Rate] <> 0
SELECT *
FROM
(
SELECT
LD.Region
,DM.ShortName AS DM
,D.Lcode
,LD.locationname
,D.UnitID
,D.dPlaced
,D.dCancelled
,D.sRentalType
,D.[Quoted Rate]
,Calcs.MinStdRate AS [Current Rate]
,-(Calcs.MinStdRate - D.[Quoted Rate]) AS [Savings ($)]
,CAST(((-(Calcs.MinStdRate - D.[Quoted Rate]))/NULLIF(D.[Quoted Rate],0))*100 AS DECIMAL (18,2)) AS [Savings (%)]
,D.sPlanName
,Calcs.[# Vacant]
FROM
(SELECT
s.sLocationCode AS lcode
,w.dPlaced
,L.dLease
,u.UnitID
,CASE
WHEN w.dCancelled IS NOT NULL THEN w.dCancelled
WHEN (w.dCancelled IS NULL AND w.dExpires <GETDATE()) THEN w.dExpires
ELSE NULL
END AS dCancelled
,CASE
WHEN (w.dCancelled IS NOT NULL OR w.dExpires <GETDATE()) THEN 'Lost'
WHEN w.QTRentalTypeID = 3 THEN 'Rented'
WHEN (w.QTRentalTypeID = 2 OR w.QTRentalTypeID = 1) THEN 'Active'
END AS sRentalType
,w.dcRate_Quoted AS 'Quoted Rate'
,c.sPlanName
,CONCAT(U.dcWidth,'x',U.dcLength) AS sSize
,UT.sTypeName
FROM CompanyDBs.dbo.waitings AS W
LEFT OUTER JOIN CompanyDBs.dbo.Ledgers AS L
ON W.LedgerID = L.LedgerID
JOIN CompanyDBs.dbo.sites AS S
ON W.SiteID = S.SiteID
JOIN CompanyDBs.dbo.units AS U
ON W.UnitID1 = U.UnitID
JOIN CompanyDBs.dbo.UnitTypes AS UT
ON U.UnitTypeID = UT.UnitTypeID
JOIN CompanyDBs.dbo.ConcessionPlans AS C
ON W.ConcessionID = C.ConcessionID
WHERE W.dCancelled < GETDATE() AND W.dCancelled >= DATEADD(DD,-60,CAST(GETDATE() AS DATE))
UNION ALL
SELECT
s.sLocationCode AS lcode
,w.dPlaced
,L.dLease
,u.UnitID
,CASE
WHEN w.dCancelled IS NOT NULL THEN w.dCancelled
WHEN (w.dCancelled IS NULL AND w.dExpires <GETDATE()) THEN w.dExpires
ELSE NULL
END AS dCancelled
,CASE
WHEN (w.dCancelled IS NOT NULL OR w.dExpires <GETDATE()) THEN 'Lost'
WHEN w.QTRentalTypeID = 3 THEN 'Rented'
WHEN (w.QTRentalTypeID = 2 OR w.QTRentalTypeID = 1) THEN 'Active'
END AS sRentalType
,w.dcRate_Quoted AS 'Quoted Rate'
,c.sPlanName
,CONCAT(U.dcWidth,'x',U.dcLength) AS sSize
,UT.sTypeName
FROM CompanyDBs1.dbo.waitings AS W
LEFT OUTER JOIN CompanyDBs1.dbo.Ledgers AS L
ON W.LedgerID = L.LedgerID
JOIN CompanyDBs1.dbo.sites AS S
ON W.SiteID = S.SiteID
JOIN CompanyDBs1.dbo.units AS U
ON W.UnitID1 = U.UnitID
JOIN CompanyDBs1.dbo.UnitTypes AS UT
ON U.UnitTypeID = UT.UnitTypeID
JOIN CompanyDBs1.dbo.ConcessionPlans AS C
ON W.ConcessionID = C.ConcessionID
WHERE W.dCancelled < GETDATE() AND W.dCancelled >= DATEADD(DD,-60,CAST(GETDATE() AS DATE))) AS D
LEFT OUTER JOIN
(SELECT
P.SiteID
,P.sLocationCode
,P.UnitID
,p.UnitCODE
,groupeddata.[# Vacant]
,GroupedData.MinStdRate
FROM
(SELECT
S2.sLocationCode
,S2.SiteID
,R2.UnitID
,CONCAT(S2.sLocationCode
,'-'
,S2.sSiteName
,' '
,R2.stypename
,' '
,CASE WHEN R2.iFloor > 1 THEN 'Up ' WHEN R2.ifloor < 1 THEN 'Down ' WHEN R2.ifloor = 1 THEN '1 ' END
,CASE WHEN R2.bPower = 1 THEN 'Power ' ELSE 'No Power ' END
,CASE WHEN R2.bClimate = 1 THEN 'CC ' ELSE 'No CC ' END
,CASE WHEN R2.bInside = 1 THEN 'In ' ELSE 'Out ' END
,CASE WHEN R2.bAlarm = 1 THEN 'Alarm ' ELSE 'No Alarm ' END
,CAST(R2.dcWidth AS FLOAT)
,'x'
,CAST(R2.dcLength AS FLOAT)) AS UnitCODE
FROM Operations.dbo.RentRoll AS R2
JOIN
(
SELECT *
FROM CompanyDBs.dbo.sites
UNION ALL
SELECT *
FROM CompanyDBs1.dbo.sites
) AS S2
ON R2.siteid = S2.SiteID
WHERE
R2.ddeleted is NULL
AND R2.bRentable = 1
AND R2.brented = 0 ) AS P
JOIN
(
SELECT
S.SiteID
,s.sLocationCode
,UnitCode.UnitCODE
,SUM(CASE
WHEN R.brented = 1 THEN 0
ELSE 1
END) AS [# Vacant]
,MIN(R.dcStdRate) AS MinStdRate
FROM Operations.dbo.RentRoll AS R
JOIN
(
SELECT *
FROM CompanyDBs.dbo.sites
UNION ALL
SELECT *
FROM CompanyDBs1.dbo.sites
) AS S
ON R.siteid = S.SiteID
JOIN
(
SELECT
S1.SiteID
,UnitID
,CONCAT(S1.sLocationCode
,'-'
,S1.sSiteName
,' '
,R1.stypename
,' '
,CASE WHEN R1.iFloor > 1 THEN 'Up ' WHEN R1.ifloor < 1 THEN 'Down ' WHEN R1.ifloor = 1 THEN '1 ' END
,CASE WHEN R1.bPower = 1 THEN 'Power ' ELSE 'No Power ' END
,CASE WHEN R1.bClimate = 1 THEN 'CC ' ELSE 'No CC ' END
,CASE WHEN R1.bInside = 1 THEN 'In ' ELSE 'Out ' END
,CASE WHEN R1.bAlarm = 1 THEN 'Alarm ' ELSE 'No Alarm ' END
,CAST(R1.dcWidth AS FLOAT)
,'x'
,CAST(R1.dcLength AS FLOAT)) AS UnitCODE
FROM Operations.dbo.RentRoll AS R1
JOIN
(
SELECT *
FROM CompanyDBs.dbo.sites
UNION ALL
SELECT *
FROM CompanyDBs1.dbo.sites
) AS S1
ON R1.siteid = S1.SiteID
) AS UnitCode
ON CONCAT(R.siteid, R.unitid) = CONCAT(UnitCode.siteid,UnitCode.UnitID)
WHERE
s.sLocationCode <> 'L003'
AND s.sLocationCode <> 'L021'
AND s.sLocationCode <> 'LSETUP'
AND s.sLocationCode <> 'LTRAIN'
AND R.bRented = 0
GROUP BY s.siteid, s.slocationcode, UnitCode.UnitCODE
) AS GroupedData
ON P.UnitCODE = GroupedData.UnitCODE
) AS Calcs
ON CONCAT(D.lcode,D.unitid) = CONCAT(Calcs.slocationcode,Calcs.unitid)
JOIN operations.dbo.westport_locationdata AS LD
ON D.lcode = ld.lcode
JOIN operations.dbo.Westport_DMs AS DM
ON LD.DMID = DM.DMID
) AS sub
WHERE sub.[Savings (%)] >= CAST(10.0 AS DECIMAL (18,2))
AND sub.[Current Rate] <> 0
AND sub.[Quoted Rate] <> 0