2016-08-23 21 views
1

比方说,我有一个表,看起来像这样:的SQL Server 2012:可以在IIF功能拿起基于条件的最后分配的值

+---------+-----------+------------+ 
| Company | Quantity |  Date | 
+---------+-----------+------------+ 
| A  |  10000 | 2016-08-01 | 
| B  |  -5000 | 2016-08-01 | 
| C  |  5000 | 2016-08-01 | 
| A  |  5000 | 2016-08-02 | 
| B  |  -2500 | 2016-08-02 | 
| C  |  5000 | 2016-08-02 | 
| A  |   0 | 2016-08-03 | 
| B  |   0 | 2016-08-03 | 
| C  |  5000 | 2016-08-03 | 
+---------+-----------+------------+ 

我试图创建一个名为列的视图IssuerLS如果数量为+ ve,则列值为'L',如果数量为-ve,列值将为'S'。这部分很容易与IIF的功能,但我也想用最后已知的值,如果数量为0,所以我认为应该是这样的:

+---------+----------+------------+----------+ 
| Company | Quantity | Date | IssuerLS | 
+---------+----------+------------+----------+ 
| A  | 10000 | 2016-08-01 | L  | 
| B  | -5000 | 2016-08-01 | S  | 
| C  |  5000 | 2016-08-01 | L  | 
| A  |  5000 | 2016-08-02 | L  | 
| B  | -2500 | 2016-08-02 | S  | 
| C  |  5000 | 2016-08-02 | L  | 
| A  |  0 | 2016-08-03 | L  | 
| B  |  0 | 2016-08-03 | S  | 
| C  |  5000 | 2016-08-03 | L  | 
+---------+----------+------------+----------+ 

有没有办法做到让IIF函数来如果数量为0,则使用每个公司最后一次已知的'L'或'S'值?

谢谢。

+0

IIF()只看到了它的输入值。 'iif(somecondition,truevalue,falsevalue)'。你必须提供'somecondition'的逻辑,而不是iif()。 –

+0

根据最后一个已知值添加L和S的逻辑是什么 – TheGameiswar

+0

因此,对于例如公司A,如果Quantity = 0,则返回数量不为0的最后一个已知日期(在本例中为2016-08 -02),并根据当天的数量(本例中为“L”)添加“L”或“S”。 – MilesToGoBeforeISleep

回答

1
;with cte 
    as 
    (select *, 
    case 
    when qty>0 then 'l' 
    when qty<0 then 'S' 
    else null end as newval 
    from #tmp 
    ) 
    select c1.cmp,c1.qty,c1.date, 
    case when newval is null then rplcval else newval end as somecol 
     from cte c1 
    cross apply 
    (
    select top 1 newval as rplcval from cte c2 where c2.date<=c1.date and c1.cmp = c2.cmp 
order by date) b 
+0

感谢您的帮助。这也工作。 – MilesToGoBeforeISleep

1

可以使用case和outer apply来完成。

SELECT *, 
     CASE WHEN Quantity = 0 THEN CASE WHEN prevQuantity > 0 THEN 'L' ELSE 'S'END 
      ELSE CASE WHEN Quantity > 0 THEN 'L' ELSE 'S' END 
     END 
FROM Table1 t1 
     OUTER APPLY (SELECT TOP 1 
          Quantity prevQuantity 
        FROM Table1 t2 
        WHERE t2.Company = t1.Company 
          AND t2.Date < t1.Date 
          AND t2.Quantity <> 0 
        ORDER BY [Date] DESC 
        ) t2 

,如果你想使用IIF然后

SELECT *, 
     IIF(Quantity <> 0, IIF(Quantity > 0, 'L','S'), IIF(prevQuantity > 0, 'L','S')) 
FROM Table1 t1 
     CROSS APPLY (SELECT TOP 1 
          Quantity prevQuantity 
        FROM Table1 t2 
        WHERE t2.Company = t1.Company 
          AND t2.Date <= t1.Date 
          AND t2.Quantity <> 0 
        ORDER BY [Date] DESC 
        ) t2 
+0

谢谢。我尝试了两个,他们都工作。我不得不阅读外部申请和跨申请,因为我不熟悉它们。 – MilesToGoBeforeISleep