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;