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