【问题标题】:SQL Server CASE returns NULL even when there are values即使有值,SQL Server CASE 也会返回 NULL
【发布时间】:2015-12-30 07:48:00
【问题描述】:

以下是我的示例查询。当我运行查询时,即使日期范围内有数据,PreviousTotalQuantity 也会返回 null。

SELECT
    p.ActualId,
    p.Name,
    p.QTYONHAND AS OnHand,
    p.PRICE AS DistCost,
    SUM(soi.Quantity) AS PresentTotal,
    SUM(CASE
        WHEN soi.MASSCHDSHIPDATE > '2014-3-1' AND
            soi.MASSCHDSHIPDATE < '2014-6-1' THEN soi.Quantity
        ELSE NULL
    END) AS PreviousTotalQuantity
FROM 
    sysdba.PRODUCT p
    LEFT OUTER JOIN sysdba.SALESORDERITEMS soi
        ON p.PRODUCTID = soi.PRODUCTID
WHERE 
    soi.MASSCHDSHIPDATE > '2015-3-1' AND 
    soi.MASSCHDSHIPDATE < '2015-6-1'
GROUP BY p.PRODUCTID, p.ACTUALID, p.NAME, p.QTYONHAND, p.PRICE

我还需要从给定日期提取上一年的数据。

【问题讨论】:

  • 您使用的日期格式可能会根据语言设置导致问题,您应该始终使用 YYYYMMDD。
  • 您在外连接中有表 SALESORDERITEMS,但由于您在 where 子句中使用它,它不会被外连接。如果您需要外部联接,请将日期范围移到外部联接中,但如果您只获取 2015 年,则在这种情况下您不会得到 2014 年

标签: sql sql-server null case-when


【解决方案1】:

因为您的年份在 select (2014) 和 where (2015) 部分不同步

编辑

SELECT
    p.ActualId,
    p.Name,
    p.QTYONHAND AS OnHand,
    p.PRICE AS DistCost,
    SUM(soi.Quantity) AS PresentTotal,
    ISNULL(prev.TotalQty, 0) AS PreviousTotalQuantity
FROM 
    sysdba.PRODUCT p
    LEFT OUTER JOIN sysdba.SALESORDERITEMS soi
        ON p.PRODUCTID = soi.PRODUCTID
    OUTER APPLY
    (
        SELECT SUM(Quantity) AS TotalQty 
        FROM sysdba.SALESORDERITEMS 
        WHERE PRODUCTID = p.PRODUCTID 
            AND MASSCHDSHIPDATE > '2014-03-01' AND MASSCHDSHIPDATE < '2014-06-01'
    ) AS prev
WHERE 
    soi.MASSCHDSHIPDATE > '2015-03-01' AND 
    soi.MASSCHDSHIPDATE < '2015-06-01'
GROUP BY p.PRODUCTID, p.ACTUALID, p.NAME, p.QTYONHAND, p.PRICE, prev.TotalQty

【讨论】:

  • 有什么方法可以提取那几年的数据吗?我需要提取上一年的数据。
  • 这不是case 的问题,而是您过滤掉的数据是当前年份,结果始终为空或0(如果您将其修复为黑暗骑士的答案)。通过使用子查询来选择上一年来更正您的查询
  • 您好 Eric,我尝试了您的查询,但由于某种原因它没有显示数据。执行时间过长。
【解决方案2】:

不要手动比较日期。

也使用 between 子句

Declare @PRODUCT table
(
Name varchar(50),
Date datetime,
Quantity int
)

INSERT INTO @PRODUCT VALUES ('Nikunj','2014-3-1',20)
INSERT INTO @PRODUCT VALUES ('Nikunj','2014-6-1',40)
INSERT INTO @PRODUCT VALUES ('Nikunj','2014-9-1',60)
INSERT INTO @PRODUCT VALUES ('JayDeep','2014-3-1',10)
INSERT INTO @PRODUCT VALUES ('JayDeep','2014-9-1',20)

select Name, sum(Quantity),SUM(Case when Date between '2014-3-1' and '2014-6-1' then Quantity else NULL end) TotalQuantity from @PRODUCT 
where Date between '2014-3-1' and '2014-6-1' group by Name 

相应地尝试一下,并在 where 条件代码中检查 year

【讨论】:

  • 实际上在您提到的年份是 2015 年的情况下,您正在尝试查找 2014 年的数据。这就是您没有得到任何数据的原因。
  • 尝试替换代码中的 where 条件 "WHERE soi.MASSCHDSHIPDATE > '2014-3-1' AND soi.MASSCHDSHIPDATE
  • 我想要完成的是将之前和现在的数量与给定日期进行比较。谢谢
【解决方案3】:

这里的问题是您将 WHERE 语句中的行限制为 2015 年,因此在 2014 年的结果集中没有行。因此,由于 CASE 在 WHERE 语句之后起作用,因此您得到 NULL。

如果您需要选择当前 2015 年并将该字段计算为 2014 年,您可以使用此查询。我不知道 PRODUCTID 在 sysdba.PRODUCT 中是否唯一,所以我使用带有 DISTINCT 的子查询。如果这些字段在 PRODUCTS 中是唯一的,只需使用 FROM PRODUCTS P 而不使用 DISTINCT 子查询:

SELECT
    p.ActualId,
    p.Name,
    p.QTYONHAND AS OnHand,
    p.PRICE AS DistCost,
    soi2015.SUM_Quantity AS PresentTotal,
    soi2014.SUM_Quantity AS PreviousTotalQuantity
FROM 
    (SELECT  DISTINCT 
             p.ActualId,
             p.Name,
             p.QTYONHAND AS OnHand,
             p.PRICE AS DistCost,        
             FROM sysdba.PRODUCT 
    ) p 
    LEFT OUTER JOIN 
      (SELECT PRODUCTID,SUM(soi.Quantity)  SUM_Quantity
        FROM  sysdba.SALESORDERITEMS
        WHERE (MASSCHDSHIPDATE > '2015-03-01') 
               AND (MASSCHDSHIPDATE < '2015-06-1')
        GROUP BY PRODUCTID
      ) soi2015 ON (p.PRODUCTID = soi2015.PRODUCTID) 
    LEFT OUTER JOIN 
      (SELECT PRODUCTID,SUM(soi.Quantity)  SUM_Quantity
        FROM  sysdba.SALESORDERITEMS
        WHERE (MASSCHDSHIPDATE > '2014-03-01') 
               AND (MASSCHDSHIPDATE < '2014-06-1')
        GROUP BY PRODUCTID
      ) soi2014 ON (p.PRODUCTID = soi2014.PRODUCTID) 

【讨论】:

    猜你喜欢
    • 2018-02-12
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多