Sql 简化/修复长查询
我的问题如下:Sql 简化/修复长查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的问题如下: SELECT Delivery.DeliveryNumber, DeliveryStatus.StatusName, Delivery.PickupDateTime, Delivery.DeliveryDateTime, Delivery.PackageWeight, Delivery.PackageSize, Delivery.PickupAddress1, CASE
SELECT Delivery.DeliveryNumber,
DeliveryStatus.StatusName,
Delivery.PickupDateTime,
Delivery.DeliveryDateTime,
Delivery.PackageWeight,
Delivery.PackageSize,
Delivery.PickupAddress1,
CASE
WHEN Delivery.DeliveryDateTime IS NULL THEN 'Not Delivered'
WHEN (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) > 0)
AND (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) < 24) THEN 'Delivered 24hrs After Pickup'
WHEN (DATEDIFF(dd, Delivery.PickupDateTime, Delivery.DeliveryDateTime) = 0) THEN 'Delivered Same Day'
END AS Status
FROM Delivery
INNER JOIN DeliveryStatus ON Delivery.StatusCode = DeliveryStatus.StatusCode
有没有办法清理这个查询
我的任务是设计一个查询,使其返回满足以下条件的行:
已提货交付但尚未交付的包裹
提货后一天内交付的包裹少于24小时
在提货当天交付的包裹
提货前一天在24小时内交付的包裹
我想我问对了。我只是需要帮忙清理一下,因为它看起来很脏。有什么想法吗
编辑:添加了整个数据结构:
因此,您的问题是,您不希望将同一逻辑编码两次,一次在where子句中,一次在select列表中。您可以通过外部查询从您已有的行中选取所需的行来解决此问题:
SELECT *
FROM
(
SELECT Delivery.DeliveryNumber,
DeliveryStatus.StatusName,
Delivery.PickupDateTime,
Delivery.DeliveryDateTime,
Delivery.PackageWeight,
Delivery.PackageSize,
Delivery.PickupAddress1,
CASE
WHEN Delivery.DeliveryDateTime IS NULL THEN 'Not Delivered'
WHEN (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) > 0)
AND (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) < 24) THEN 'Delivered 24hrs After Pickup'
WHEN (DATEDIFF(dd, Delivery.PickupDateTime, Delivery.DeliveryDateTime) = 0) THEN 'Delivered Same Day'
END AS Status
FROM Delivery
INNER JOIN DeliveryStatus ON Delivery.StatusCode = DeliveryStatus.StatusCode
)
WHERE Status IS NOT NULL;
那么COALESCE呢?另外,我认为这里没有很多人能够猜到你的数据结构该死,试图滚动图片。我不明白:当DATEDIFFhh,Delivery.PickupDateTime,Delivery.DeliveryDateTime>0和DATEDIFFhh,Delivery.PickupDateTime,Delivery.DeliveryDateTime<24,然后是“提货后24小时交货”,当DATEDIFFdd,Delivery.PickupDateTime,Delivery.DeliveryDateTime=0时,然后是“当天交货”,因为这里两种逻辑都显示24小时内或当天交货,我认为这是正确的?它应该显示提货后24小时交货,另一个箱子是当天交货。
SELECT *
FROM
(
SELECT Delivery.DeliveryNumber,
DeliveryStatus.StatusName,
Delivery.PickupDateTime,
Delivery.DeliveryDateTime,
Delivery.PackageWeight,
Delivery.PackageSize,
Delivery.PickupAddress1,
CASE
WHEN Delivery.DeliveryDateTime IS NULL THEN 'Not Delivered'
WHEN (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) > 0)
AND (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) < 24) THEN 'Delivered 24hrs After Pickup'
WHEN (DATEDIFF(dd, Delivery.PickupDateTime, Delivery.DeliveryDateTime) = 0) THEN 'Delivered Same Day'
END AS Status
FROM Delivery
INNER JOIN DeliveryStatus ON Delivery.StatusCode = DeliveryStatus.StatusCode
)
WHERE Status IS NOT NULL;