2015-10-02 2 views
1

Ниже приведен пример моего запроса. Когда я запускаю запрос, значение PreviousTotalQuantity возвращает null, даже если в диапазоне дат есть данные.SQL Server CASE возвращает 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 

Мне также нужно вытащить данные за предыдущий год с указанной датой.

+0

дата формат вы используете может вызвать проблемы, в зависимости языковые настройки, вы всегда должны использовать ГГГГММДД. –

+1

У вас есть таблица SALESORDERITEMS во внешнем соединении, но поскольку вы используете ее в разделе where, она не будет соединена с внешним. Переместите диапазон дат во внешнее соединение, если вам нужно иметь внешнее соединение, но если вы используете только 2015, вы не получите 2014 в случае –

ответ

0

Потому что ваши годы не синхронизированы в избранной (2014) и где (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 
+0

Есть ли способ вытащить данные из этих лет? Мне нужно извлечь данные из предыдущего года. – Rom

+0

Это не вопрос 'case', но данные, которые вы отфильтровали, являются текущим годом, результат всегда равен null или 0 (если вы исправите это как ответ Dark Knight). Исправьте свой запрос, используя подзапрос, чтобы выбрать предыдущий год – Eric

+0

Привет, Эрик, я попробовал ваш запрос, но по какой-то причине он не отображает данные. Это слишком долго. – Rom

0

Не сравнивайте дату вручную.

Использование между пункт либо

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 

Попробуйте это, соответственно, и не проверить год в коде где условия.

+0

Я пробовал ваше решение, но это тот же результат. – Rom

+0

Фактически в вашем состоянии, в котором вы указали год 2015 года, и вы пытаетесь найти данные 2014 года. Вот почему вы не получаете никаких данных. –

+0

попробуйте заменить это, когда условие «WHERE soi.MASSCHDSHIPDATE>« 2014-3-1 »и soi.MASSCHDSHIPDATE <'2014-6-1' 'в вашем коде –

0

Проблема заключается в том, что вы ограничиваете строки в инструкции WHERE с 2015 годом, и из-за этого в результирующем наборе в 2014 году нет строк. Таким образом, вы получаете NULL из-за работы CASE ПОСЛЕ WHERE.

Если вам нужно выбрать текущий 2015 год и сосчитать это поле на 2014 год, вы можете использовать этот запрос. Я не знаю, является ли PRODUCTID уникальным в sysdba.PRODUCT, поэтому я использую подзапрос с DISTINCT. Если эти поля являются уникальными в продуктах просто использовать FROM PRODUCTS P без отчетливого подзапроса:

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) 
Смежные вопросы