簡體   English   中英

編寫此sql的更好方法-CTE / Temp表

[英]Better way to write this sql - CTE/Temp table

對於如何以更有效的方式編寫此代碼,我確實可以提供一些幫助。 我基本上是創建一個CTE來保存包含車輛的數據集,該數據集包括車輛,每天及其裝載的集裝箱的重量。 容器必須具有一定的重量,因此通過/失敗字段。

我要做的就是在CTE中獲取舉升水平詳細信息,並將其匯總為通過/未通過標准的舉升集裝箱數量,並匯總任何舉升失敗的原因。

我只是想知道最好的方法是使用CTE,還是使用臨時表或任何一種方法來加快速度或采用更標准的做法?

理想情況下,我先發布CTE數據的圖像,然后發布輸出數據,但我無法發布圖像:(

提前謝謝了

WITH DetailLifts
     AS (SELECT CO.Description                      'Outlet',
                LE.[VehicleCode],
                S.FORENAME + ' ' + S.SURNAME        AS Name,
                le.[CollectionDate],
                le.lifteventid,
                C.CustomerName,
                Cast([CollectionTimeStamp] AS TIME) 'CollectionTime',
                LE.[NetWeight],
                le.grossweight,
                le.tareweight,
                ct.description,
                CASE
                  WHEN CT.Description LIKE 'Euro%' THEN 10
                  WHEN CT.Description LIKE 'FEL%' THEN 30
                END                                 'Threshold',
                CASE
                  WHEN le.Grossweight IS NOT NULL
                       AND le.grossweight - le.tareweight < ( CASE
                                                                WHEN CT.Description LIKE 'Euro%' THEN -10
                                                                WHEN CT.Description LIKE 'FEL%' THEN -30
                                                              END )
                        OR le.grossweight - le.tareweight > ( CASE
                                                                WHEN CT.Description LIKE 'Euro%' THEN 10
                                                                WHEN CT.Description LIKE 'FEL%' THEN 30
                                                              END ) THEN 1
                  WHEN le.grossweight IS NULL
                       AND le.netweight < ( CASE
                                              WHEN CT.Description LIKE 'Euro%' THEN -10
                                              WHEN CT.Description LIKE 'FEL%' THEN -30
                                            END )
                        OR le.netweight > ( CASE
                                              WHEN CT.Description LIKE 'Euro%' THEN 10
                                              WHEN CT.Description LIKE 'FEL%' THEN 30
                                            END ) THEN 1
                  WHEN le.netweight IS NULL THEN 0
                  WHEN le.grossweight = 0
                       AND le.tareweight = 0
                       AND le.netweight = 0 THEN 0
                  ELSE 0
                END                                 'Overweight',
                CASE
                  WHEN Isnull([LiftText], 'No') = 'No' THEN 1
                  ELSE 0
                END                                 AS 'NoLift',
                CASE
                  WHEN Isnull([LiftText], 'No') = 'no' THEN 0
                  ELSE 1
                END                                 AS 'Lifts',
                CASE
                  WHEN SOI.SiteOrderId IS NULL THEN 'Not Matched'
                  ELSE 'Matched'
                END                                 AS 'MatchedLogic',
                CASE
                  WHEN Isnull([LiftText], 'No') = 'No'
                       AND LiftInformationId IS NOT NULL THEN 'Yes'
                  ELSE 'No'
                END                                 'Reason Code Used',
                r2.Description                      AS 'ReasonCode',
                CASE
                  WHEN le.Grossweight IS NOT NULL
                       AND le.grossweight - le.tareweight < ( CASE
                                                                WHEN CT.Description LIKE 'Euro%' THEN -10
                                                                WHEN CT.Description LIKE 'FEL%' THEN -30
                                                              END )
                        OR le.grossweight - le.tareweight > ( CASE
                                                                WHEN CT.Description LIKE 'Euro%' THEN 10
                                                                WHEN CT.Description LIKE 'FEL%' THEN 30
                                                              END ) THEN 0
                  WHEN le.grossweight IS NULL
                       AND le.netweight < ( CASE
                                              WHEN CT.Description LIKE 'Euro%' THEN -10
                                              WHEN CT.Description LIKE 'FEL%' THEN -30
                                            END )
                        OR le.netweight > ( CASE
                                              WHEN CT.Description LIKE 'Euro%' THEN 10
                                              WHEN CT.Description LIKE 'FEL%' THEN 30
                                            END ) THEN 0
                  WHEN ( Substring(le.vehiclecode, 3, 2) IN ( 57, 58, 63, 14,
                                                              64, 15, 65 )
                          OR ct.description LIKE '%fel%' )
                       AND le.netweight IS NOT NULL
                       AND le.grossweight IS NULL THEN 0
                  WHEN le.netweight IS NULL
                        OR ( le.grossweight = 0
                             AND le.tareweight = 0 ) THEN 0
                  ELSE 1
                END                                 'Pass',
                CASE
                  WHEN le.Grossweight IS NOT NULL
                       AND le.grossweight - le.tareweight < ( CASE
                                                                WHEN CT.Description LIKE 'Euro%' THEN -10
                                                                WHEN CT.Description LIKE 'FEL%' THEN -30
                                                              END )
                        OR le.grossweight - le.tareweight > ( CASE
                                                                WHEN CT.Description LIKE 'Euro%' THEN 10
                                                                WHEN CT.Description LIKE 'FEL%' THEN 30
                                                              END ) THEN 1
                  WHEN le.grossweight IS NULL
                       AND le.netweight < ( CASE
                                              WHEN CT.Description LIKE 'Euro%' THEN -10
                                              WHEN CT.Description LIKE 'FEL%' THEN -30
                                            END )
                        OR le.netweight > ( CASE
                                              WHEN CT.Description LIKE 'Euro%' THEN 10
                                              WHEN CT.Description LIKE 'FEL%' THEN 30
                                            END ) THEN 1
                  WHEN ( Substring(le.vehiclecode, 3, 2) IN ( 57, 58, 63, 14,
                                                              64, 15, 65 )
                          OR ct.description LIKE '%fel%' )
                       AND le.netweight IS NOT NULL
                       AND le.grossweight IS NULL THEN 1
                  WHEN le.netweight IS NULL
                        OR ( le.grossweight = 0
                             AND le.tareweight = 0 ) THEN 1
                  ELSE 0
                END                                 'Fail',
                lifttext,
                CASE
                  WHEN ( Substring(le.vehiclecode, 3, 2) IN ( 57, 58, 63, 14,
                                                              64, 15, 65 )
                          OR ct.description LIKE '%fel%' )
                       AND le.netweight IS NOT NULL
                       AND le.grossweight IS NULL THEN 1
                  ELSE 0
                END                                 AS 'VehicleFault'
         FROM   [CFO_P155_Pre_Production_ELEMOS].[dbo].[LiftEvent]LE
                LEFT JOIN CFO_P155_Pre_Production_ELEMOS.dbo.Route RT
                       ON RT.routeid = le.routeid
                LEFT JOIN CFO_P155_Pre_Production_ELEMOS.dbo.SysUser S
                       ON S.sysuserid = RT.driversysuserid
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[Vehicle]V
                       ON LE.VehicleId = V.VehicleId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[CompanyOutlet]CO
                       ON V.CompanyOutletId = CO.CompanyOutletId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[Reason]R
                       ON LE.LiftProblemId = R.ReasonId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[Reason]R2
                       ON LE.LiftInformationId = R2.ReasonId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[SiteOrderItem]SOI
                       ON SOI.SiteOrderItemId = LE.SiteOrderItemId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[SiteOrder]SO
                       ON SOI.SiteOrderId = SO.SiteOrderId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[CustomerSite]CS
                       ON SO.CustomerSiteId = CS.CustomerSiteId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[Location]L
                       ON CS.LocationId = L.LocationId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[Customer]C
                       ON CS.CustomerId = C.CustomerId
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[Material]M
                       ON SO.MaterialId = M.Materialid
                LEFT JOIN [CFO_P155_Pre_Production_ELEMOS].[dbo].[ContainerType]CT
                       ON SOI.ContainerTypeId = CT.ContainerTypeId
         WHERE  CO.Description IN ( 'Portsmouth' )
                AND le.CollectionDate >= '2015-03-02'
                AND le.CollectionDate <= '2015-03-06'
                AND ( ct.description LIKE '%euro%'
                       OR ct.description LIKE '%FEl%' )
                --and substring(le.vehiclecode,3,2) in (57,58,63,64,65) and le.netweight is         not null and le.grossweight is null
                AND C.Customerid = 18407)
SELECT dl.outlet,
       dl.collectiondate,
       dl.vehiclecode,
       dl.name,
       CASE
         WHEN passesandfails.Pass >= 5
              AND passesandfails.Fail = 0 THEN 'Pass'
         ELSE 'Fail'
       END                                        AS 'Pass or Fail',
       passesandfails.pass,
       passesandfails.fail,
       Isnull(matchedlifts.matchedActuallifts, 0) AS MatchedActualLifts,
       Isnull(lifted.NoLift, 0)                   AS 'MatchedNotLifted(Lift  Complete)',
       Isnull(overweights.overweight, 0)          AS Overweights,
       Sum(vehiclefault)                          AS VehicleFault
FROM   DetailLifts DL
       LEFT JOIN (SELECT outlet,
                         collectiondate,
                         vehiclecode,
                         Sum(pass) pass,
                         Sum(fail) fail
                  FROM   detaillifts dl
                  GROUP  BY outlet,
                            collectiondate,
                            vehiclecode) AS PassesandFails
              ON dl.Collectiondate = passesandfails.collectiondate
                 AND dl.vehiclecode = passesandfails.vehiclecode
       LEFT JOIN (SELECT outlet,
                         collectiondate,
                         vehiclecode,
                         Sum(overweight)AS overweight
                  FROM   detaillifts DL
                  GROUP  BY outlet,
                            collectiondate,
                            vehiclecode) AS Overweights
              ON dl.collectiondate = overweights.collectiondate
                 AND dl.vehiclecode = overweights.vehiclecode
       LEFT JOIN (SELECT collectiondate,
                         vehiclecode,
                         Count(lifteventid) AS MatchedActualLifts
                  FROM   detaillifts DL
                  WHERE  lifttext IS NOT NULL
                  GROUP  BY collectiondate,
                            vehiclecode) AS MatchedLifts
              ON dl.collectiondate = matchedlifts.collectiondate
                 AND dl.vehiclecode = matchedlifts.vehiclecode
       LEFT JOIN (SELECT collectiondate,
                         vehiclecode,
                         Sum(lifts)  AS Lifts,
                         Sum(nolift) AS NoLift
                  FROM   detaillifts
                  GROUP  BY collectiondate,
                            vehiclecode)AS lifted
              ON lifted.collectiondate = dl.collectiondate
                 AND lifted.vehiclecode = dl.vehiclecode
GROUP  BY dl.outlet,
          dl.collectiondate,
          dl.vehiclecode,
          dl.name,
          matchedActuallifts,
          passesandfails.pass,
          passesandfails.fail,
          lifted.nolift,
          overweights.overweight
ORDER  BY outlet,
          collectiondate,
          vehiclecode 

CTE只是語法,並且經過評估
但是,如果CTE運行得很快,那就不是問題
實現到t #temp需要付出代價
單獨運行CTE需要多長時間?
整個查詢需要很長時間?

但是您不需要兩個聯接

將總和(超重)AS超重上移至PassesandFails

將Count(lifteventid)向下移動到提升為Count(lifttext)
null不計算在內

這樣會將連接開銷減少了1/2

如果您得到期望的答案,那么發布數據沒有目的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM