简体   繁体   English

SQL Server CASE即使存在值也返回NULL

[英]SQL Server CASE returns NULL even when there are values

Below is my sample Query. 以下是我的示例查询。 When I run the query the PreviousTotalQuantity returns null even there are data with in the date range. 当我运行查询时,即使有日期范围内的数据,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

I need also to pull the data from the previous year with the given date. 我还需要提取给定日期的上一年的数据。

Because your years are not in sync in select (2014) and where (2015) part 因为您的年份在select(2014)和where(2015)部分中不同步

Edit 编辑

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

Don't compare date manually. 不要手动比较日期。

Use between clause either 条款之间使用

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 

Try this accordingly and do check year in the where condition code. 相应地尝试此操作,并在where条件代码中检查年份

The issue here is that you restrict rows in WHERE statement with year 2015 and because of it there are no rows in result set in year 2014. So you get NULL because of CASE works AFTER WHERE statement. 这里的问题是,您将WHERE语句中的行限制为2015年,因此2014年结果集中没有行。由于CASE在AFTER WHERE语句中起作用,所以您将得到NULL。

If you need select current 2015 year and count this field for 2014 you can use this query. 如果您需要选择当前的2015年并将2014年计入此字段,则可以使用此查询。 I doesn't know if PRODUCTID is unique in sysdba.PRODUCT so I use subquery with DISTINCT. 我不知道PRODUCTID在sysdba.PRODUCT中是否唯一,因此我将子查询与DISTINCT一起使用。 If these fields are unique in PRODUCTS just use FROM PRODUCTS P without DISTINCT subquery: 如果这些字段在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) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM