[英]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.