Я мог бы действительно помочь с тем, как написать этот код более эффективным способом. Я в основном создаю CTE для хранения набора данных, содержащего транспортные средства, днем и веса контейнеров, которые они загружают. Контейнеры должны быть определенным весом, поэтому поля пропуска/отказа.Лучший способ написать эту таблицу sql-CTE/Temp
Все, что я пытаюсь сделать, это взять деталь уровня лифта в 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 - это просто синтаксис, поэтому его оценивают более одного раза. Вы можете использовать Count (lifttext) и исключить одно соединение, – Paparazzi
будет проще, если вы сможете опубликовать таблицу данных примера и ожидаемую таблицу вывода – sam
, спасибо ребятам. Каков наилучший способ опубликовать образцы данных? Как разместить стол? – user3103335