SQL 这将排除某些记录
SQL That Will Exclude Certain Records
我正在为我们公司撰写一份速度报告。这是从我们的车队收集的数据。我们已配置参数,以根据他们驾驶的州、该位置发布的速度限制等来标记超速超过特定阈值的人。
我的 SQL 查询正在使用 CTE。当 select 从我的 CTE 中读取时,我在其中包装了两个 select 语句。一个 select 语句用于满足或超过阈值要求的记录。我有一个名为 SpeedingEvent 的字段,这些记录包含 "Y" 的值(表示是)。第二个select语句返回的是不满足或超过阈值的记录,SpeedingEvent值为"N"表示No。这两个select语句的结果用一个UNION连接.
有点奇怪,但我的公司也希望能够看到发生的超速事件,即使它们没有达到阈值。我的问题是,其中一些被排除的记录,即 SpeedingEvent 值为 "N" 的记录,在 SpeedingEvent = "Y" 且日期和舰队编号匹配的数据集中没有匹配记录.
因此,当我的 SSRS 报告生成时,我看到这些数据行被排除在外,但与确实满足阈值的现有记录没有任何关系。
我已尝试创建子查询,但它不起作用,因为我收到一条错误消息,指出子查询返回了超过 1 个值,并且在使用某些比较值时不允许这样做。
这是我的代码示例。这不是全部,因为返回的字段很多。
WITH cteSpeedReport([List of fields])
AS
(
SELECT DISTINCT
[List of fields]
FROM
[4 views that are being joined]
WHERE
[Criteria for meeting threshold]
)
SELECT DISTINCT
[List of Fields]
FROM (
SELECT DISTINCT DStartDate, DEndDate, DAssetID, DFleet, (DMax - DStateLimit) as DMaxOver, DEventStart, DEventEnd, DTotalEventSpeedingTime, EventSpeedingTimeInSeconds, DLimit, DStateLimit, DMax, EquipTypeQualifier, NDAssetID, NDFleet, NDDate, NDDriveTime, NDTotalDriveTimeInSeconds, SpeedPercentage, MilesSpeeding, CLatLong, CMapLink, CLocation, CMaxReportedSpeed, hlvl1no, hlvl1name, hlvl2no, hlvl2name, hlvl3no, hlvl3name, hlvl9no, hlvl9name, asset_id, asset_descr, equip_type, equiptype_code, insp_fleet, MaxSpdStartTime, MaxSpdEndTime, cast('Y' as char(1)) SpeedingEvent
from cteSpeedReport cteSR
where
(EquipTypeQualifier = 'Y'
AND ((CLocation = 'Michigan' AND
(DLimit = 70 AND DMax >= 70)
OR (DLimit = 65 AND DMax >= 71.5)
OR (DLimit = 60 AND DMax > 66)
OR (DLimit <= 55 AND DMax >= (DLimit * 1.10)))
OR (CLocation = 'Indiana' AND
(DLimit = 70 AND DMax > 71.5)
OR (DLimit = 65 AND DMax > 71.5)
OR (DLimit <= 55 AND DMax >= (DLimit * 1.10)))))
OR (DMax >= (DLimit * 1.10))
UNION
SELECT DISTINCT DStartDate, DEndDate, DAssetID, DFleet, (DMax - DStateLimit) as DMaxOver, DEventStart, DEventEnd, DTotalEventSpeedingTime, EventSpeedingTimeInSeconds, DLimit, DStateLimit, DMax, EquipTypeQualifier, NDAssetID, NDFleet, NDDate, NDDriveTime, NDTotalDriveTimeInSeconds, SpeedPercentage, MilesSpeeding, CLatLong, CMapLink, CLocation, CMaxReportedSpeed, hlvl1no, hlvl1name, hlvl2no, hlvl2name, hlvl3no, hlvl3name, hlvl9no, hlvl9name, asset_id, asset_descr, equip_type, equiptype_code, insp_fleet, MaxSpdStartTime, MaxSpdEndTime, cast('N' as char(1)) SpeedingEvent
from cteSpeedReport cteSRN
where
(EquipTypeQualifier = 'Y'
AND ((CLocation = 'Michigan' AND
(DLimit = 70 AND DMax < 70)
OR (DLimit = 65 AND DMax < 71.5)
OR (DLimit = 60 AND DMax <= 66)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10)))
OR (CLocation = 'Indiana' AND
(DLimit = 70 AND DMax <= 71.5)
OR (DLimit = 65 AND DMax <= 71.5)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10))))
)
OR (DMax < (DLimit * 1.10))
) a
where
a.NDTotalDriveTimeInSeconds =
(SELECT sr.NDTotalDriveTimeInSeconds FROM cteSpeedReport sr
where sr.DStartDate = a.DStartDate and sr.DFleet = a.DFleet
)
order by SpeedingEvent desc, DStartDate, hlvl9name, DFleet, DEventStart
如有任何帮助,我们将不胜感激。
我认为问题出在您的 WHERE 子句中,子查询返回多个结果 - 给出 .
WHERE a.NDTotalDriveTimeInSeconds =
(SELECT sr.NDTotalDriveTimeInSeconds FROM cteSpeedReport sr
WHERE sr.DStartDate = a.DStartDate AND sr.DFleet = a.DFleet )
您可以将其更改为 MAX 或 SUM 或向 WHERE 子句添加更多条件 - 具体取决于逻辑的工作方式。
WHERE a.NDTotalDriveTimeInSeconds =
(SELECT SUM(sr.NDTotalDriveTimeInSeconds) FROM cteSpeedReport sr
WHERE sr.DStartDate = a.DStartDate AND sr.DFleet = a.DFleet )
另一方面,您可以过滤一般结果,然后使用 CASE 语句来确定 Y 或 N,而不是合并两种可能性 对于 SpeedingEvent 列。
SELECT DISTINCT
[List of Fields]
FROM (
SELECT DISTINCT DStartDate, DEndDate, DAssetID, DFleet, (DMax - DStateLimit) as DMaxOver, DEventStart, DEventEnd, DTotalEventSpeedingTime,
EventSpeedingTimeInSeconds, DLimit, DStateLimit, DMax, EquipTypeQualifier, NDAssetID, NDFleet, NDDate, NDDriveTime, NDTotalDriveTimeInSeconds,
SpeedPercentage, MilesSpeeding, CLatLong, CMapLink, CLocation, CMaxReportedSpeed, hlvl1no, hlvl1name, hlvl2no, hlvl2name, hlvl3no,
hlvl3name, hlvl9no, hlvl9name, asset_id, asset_descr, equip_type, equiptype_code, insp_fleet, MaxSpdStartTime, MaxSpdEndTime,
CAST(
CASE WHEN (CLocation = 'Michigan' AND (DLimit = 70 AND DMax < 70)
OR (DLimit = 65 AND DMax < 71.5)
OR (DLimit = 60 AND DMax <= 66)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10)))
OR (CLocation = 'Indiana' AND (DLimit = 70 AND DMax <= 71.5)
OR (DLimit = 65 AND DMax <= 71.5)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10)))
THEN 'Y' ELSE 'N' END AS CHAR(1)) SpeedingEvent
FROM cteSpeedReport cteSR
WHERE
EquipTypeQualifier = 'Y'
) a
WHERE a.NDTotalDriveTimeInSeconds =
(SELECT SUM(sr.NDTotalDriveTimeInSeconds)
FROM cteSpeedReport sr
WHERE sr.DStartDate = a.DStartDate AND sr.DFleet = a.DFleet )
ORDER BY SpeedingEvent DESC, DStartDate, hlvl9name, DFleet, DEventStart
我正在为我们公司撰写一份速度报告。这是从我们的车队收集的数据。我们已配置参数,以根据他们驾驶的州、该位置发布的速度限制等来标记超速超过特定阈值的人。
我的 SQL 查询正在使用 CTE。当 select 从我的 CTE 中读取时,我在其中包装了两个 select 语句。一个 select 语句用于满足或超过阈值要求的记录。我有一个名为 SpeedingEvent 的字段,这些记录包含 "Y" 的值(表示是)。第二个select语句返回的是不满足或超过阈值的记录,SpeedingEvent值为"N"表示No。这两个select语句的结果用一个UNION连接.
有点奇怪,但我的公司也希望能够看到发生的超速事件,即使它们没有达到阈值。我的问题是,其中一些被排除的记录,即 SpeedingEvent 值为 "N" 的记录,在 SpeedingEvent = "Y" 且日期和舰队编号匹配的数据集中没有匹配记录.
因此,当我的 SSRS 报告生成时,我看到这些数据行被排除在外,但与确实满足阈值的现有记录没有任何关系。
我已尝试创建子查询,但它不起作用,因为我收到一条错误消息,指出子查询返回了超过 1 个值,并且在使用某些比较值时不允许这样做。
这是我的代码示例。这不是全部,因为返回的字段很多。
WITH cteSpeedReport([List of fields])
AS
(
SELECT DISTINCT
[List of fields]
FROM
[4 views that are being joined]
WHERE
[Criteria for meeting threshold]
)
SELECT DISTINCT
[List of Fields]
FROM (
SELECT DISTINCT DStartDate, DEndDate, DAssetID, DFleet, (DMax - DStateLimit) as DMaxOver, DEventStart, DEventEnd, DTotalEventSpeedingTime, EventSpeedingTimeInSeconds, DLimit, DStateLimit, DMax, EquipTypeQualifier, NDAssetID, NDFleet, NDDate, NDDriveTime, NDTotalDriveTimeInSeconds, SpeedPercentage, MilesSpeeding, CLatLong, CMapLink, CLocation, CMaxReportedSpeed, hlvl1no, hlvl1name, hlvl2no, hlvl2name, hlvl3no, hlvl3name, hlvl9no, hlvl9name, asset_id, asset_descr, equip_type, equiptype_code, insp_fleet, MaxSpdStartTime, MaxSpdEndTime, cast('Y' as char(1)) SpeedingEvent
from cteSpeedReport cteSR
where
(EquipTypeQualifier = 'Y'
AND ((CLocation = 'Michigan' AND
(DLimit = 70 AND DMax >= 70)
OR (DLimit = 65 AND DMax >= 71.5)
OR (DLimit = 60 AND DMax > 66)
OR (DLimit <= 55 AND DMax >= (DLimit * 1.10)))
OR (CLocation = 'Indiana' AND
(DLimit = 70 AND DMax > 71.5)
OR (DLimit = 65 AND DMax > 71.5)
OR (DLimit <= 55 AND DMax >= (DLimit * 1.10)))))
OR (DMax >= (DLimit * 1.10))
UNION
SELECT DISTINCT DStartDate, DEndDate, DAssetID, DFleet, (DMax - DStateLimit) as DMaxOver, DEventStart, DEventEnd, DTotalEventSpeedingTime, EventSpeedingTimeInSeconds, DLimit, DStateLimit, DMax, EquipTypeQualifier, NDAssetID, NDFleet, NDDate, NDDriveTime, NDTotalDriveTimeInSeconds, SpeedPercentage, MilesSpeeding, CLatLong, CMapLink, CLocation, CMaxReportedSpeed, hlvl1no, hlvl1name, hlvl2no, hlvl2name, hlvl3no, hlvl3name, hlvl9no, hlvl9name, asset_id, asset_descr, equip_type, equiptype_code, insp_fleet, MaxSpdStartTime, MaxSpdEndTime, cast('N' as char(1)) SpeedingEvent
from cteSpeedReport cteSRN
where
(EquipTypeQualifier = 'Y'
AND ((CLocation = 'Michigan' AND
(DLimit = 70 AND DMax < 70)
OR (DLimit = 65 AND DMax < 71.5)
OR (DLimit = 60 AND DMax <= 66)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10)))
OR (CLocation = 'Indiana' AND
(DLimit = 70 AND DMax <= 71.5)
OR (DLimit = 65 AND DMax <= 71.5)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10))))
)
OR (DMax < (DLimit * 1.10))
) a
where
a.NDTotalDriveTimeInSeconds =
(SELECT sr.NDTotalDriveTimeInSeconds FROM cteSpeedReport sr
where sr.DStartDate = a.DStartDate and sr.DFleet = a.DFleet
)
order by SpeedingEvent desc, DStartDate, hlvl9name, DFleet, DEventStart
如有任何帮助,我们将不胜感激。
我认为问题出在您的 WHERE 子句中,子查询返回多个结果 - 给出 .
WHERE a.NDTotalDriveTimeInSeconds =
(SELECT sr.NDTotalDriveTimeInSeconds FROM cteSpeedReport sr
WHERE sr.DStartDate = a.DStartDate AND sr.DFleet = a.DFleet )
您可以将其更改为 MAX 或 SUM 或向 WHERE 子句添加更多条件 - 具体取决于逻辑的工作方式。
WHERE a.NDTotalDriveTimeInSeconds =
(SELECT SUM(sr.NDTotalDriveTimeInSeconds) FROM cteSpeedReport sr
WHERE sr.DStartDate = a.DStartDate AND sr.DFleet = a.DFleet )
另一方面,您可以过滤一般结果,然后使用 CASE 语句来确定 Y 或 N,而不是合并两种可能性 对于 SpeedingEvent 列。
SELECT DISTINCT
[List of Fields]
FROM (
SELECT DISTINCT DStartDate, DEndDate, DAssetID, DFleet, (DMax - DStateLimit) as DMaxOver, DEventStart, DEventEnd, DTotalEventSpeedingTime,
EventSpeedingTimeInSeconds, DLimit, DStateLimit, DMax, EquipTypeQualifier, NDAssetID, NDFleet, NDDate, NDDriveTime, NDTotalDriveTimeInSeconds,
SpeedPercentage, MilesSpeeding, CLatLong, CMapLink, CLocation, CMaxReportedSpeed, hlvl1no, hlvl1name, hlvl2no, hlvl2name, hlvl3no,
hlvl3name, hlvl9no, hlvl9name, asset_id, asset_descr, equip_type, equiptype_code, insp_fleet, MaxSpdStartTime, MaxSpdEndTime,
CAST(
CASE WHEN (CLocation = 'Michigan' AND (DLimit = 70 AND DMax < 70)
OR (DLimit = 65 AND DMax < 71.5)
OR (DLimit = 60 AND DMax <= 66)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10)))
OR (CLocation = 'Indiana' AND (DLimit = 70 AND DMax <= 71.5)
OR (DLimit = 65 AND DMax <= 71.5)
OR (DLimit <= 55 AND DMax < (DLimit * 1.10)))
THEN 'Y' ELSE 'N' END AS CHAR(1)) SpeedingEvent
FROM cteSpeedReport cteSR
WHERE
EquipTypeQualifier = 'Y'
) a
WHERE a.NDTotalDriveTimeInSeconds =
(SELECT SUM(sr.NDTotalDriveTimeInSeconds)
FROM cteSpeedReport sr
WHERE sr.DStartDate = a.DStartDate AND sr.DFleet = a.DFleet )
ORDER BY SpeedingEvent DESC, DStartDate, hlvl9name, DFleet, DEventStart