1

假设我有一个如下所示的表:

+---------+-----------+------------+
| 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 函数很容易,但如果 Quantity 为 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        |
+---------+----------+------------+----------+

如果数量为 0,是否有办法让 IIF 函数使用每个公司的最后一个已知的“L”或“S”值?

谢谢。

4

2 回答 2

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
于 2016-08-23T16:34:42.470 回答
1

可以使用 case 和 external 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
于 2016-08-23T16:32:56.543 回答