2016-08-23 53 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