从日期排序列表中查找先前的非零值

时间:2014-12-12 00:37:59

标签: sql-server-2008

我正在运行MS-SQL Server 2008 R2 我有一个表格,其设置如下。有些日期价格为0;但它的占位符意味着上个月的价格没有变化。我可以使用Coalesce或其他函数来使用最接近的PREVIOUS日期的价值 - 这不是零吗?

**项目名称|日期|价格**

Item1    |  01/01/2013 | 10.00
Item1    |  02/01/2013 | 9.50
Item1    |  03/01/2013 | 0
Item1    |  04/01/2013 | 9.50
Item1    |  05/01/2013 | 8.00
Item1    |  06/01/2013 | 8.00
Item1    |  07/01/2013 | 6.00
Item1    |  08/01/2013 | 6.00
Item1    |  09/01/2013 | 0
Item2    |  01/01/2013 | 50.00
Item2    |  02/01/2013 | 45.00
Item2    |  03/01/2013 | 35.00
Item2    |  04/01/2013 | 30.00
Item2    |  05/01/2013 | 25.00
Item2    |  06/01/2013 | 0
Item2    |  07/01/2013 | 10.00
Item2    |  08/01/2013 | 0
Item2    |  09/01/2013 | 0

期望的输出   **项目名称|日期|价格**

Item1    |  01/01/2013 | 10.00
Item1    |  02/01/2013 | 9.50
Item1    |  03/01/2013 | 9.50
Item1    |  04/01/2013 | 9.50
Item1    |  05/01/2013 | 8.00
Item1    |  06/01/2013 | 8.00
Item1    |  07/01/2013 | 6.00
Item1    |  08/01/2013 | 6.00
Item1    |  09/01/2013 | 6.00
Item2    |  01/01/2013 | 50.00
Item2    |  02/01/2013 | 45.00
Item2    |  03/01/2013 | 35.00
Item2    |  04/01/2013 | 30.00
Item2    |  05/01/2013 | 25.00
Item2    |  06/01/2013 | 25.00
Item2    |  07/01/2013 | 10.00
Item2    |  08/01/2013 | 10.00
Item2    |  09/01/2013 | 10.00

1 个答案:

答案 0 :(得分:0)

这是样本表

SELECT * INTO #TEMP
FROM
(
SELECT 'Item1' [Item Name],      '01/01/2013' [Date], 10.00 [Price]
UNION ALL
SELECT 'Item1',      '02/01/2013', 9.50
UNION ALL
SELECT 'Item1',      '03/01/2013', 0
UNION ALL
SELECT 'Item1',      '04/01/2013', 7.50
UNION ALL
SELECT 'Item1',     '05/01/2013', 0.00
UNION ALL
SELECT 'Item1',     '06/01/2013', 0.00
UNION ALL
SELECT 'Item1',     '07/01/2013', 11.00
UNION ALL
SELECT 'Item2',      '01/01/2013', 0.00
UNION ALL
SELECT 'Item2',     '02/01/2013', 12.00
UNION ALL
SELECT 'Item2',      '03/01/2013', 0.00
UNION ALL
SELECT 'Item2',      '04/01/2013', 0.00
UNION ALL
SELECT 'Item2',     '05/01/2013', 13.00
)TAB

结果查询

 SELECT [Item Name],[Date],
CASE WHEN [Price]=0 THEN 
    ISNULL((SELECT TOP 1 [Price]
     FROM #TEMP T2 
     WHERE CAST(T2.[Date] AS DATE)<T1.[Date] AND T1.[Item Name]=T2.[Item Name] AND T2.[Price]>0
     ORDER BY CAST(T2.[Date] AS DATE) DESC),0) 
    ELSE [Price] END [Price]
FROM #TEMP T1

您的结果在这里

enter image description here

这是工作小提琴http://sqlfiddle.com/#!3/afabd/1(如果它在加载页面上显示任何错误,请按RUNSQL,它会起作用)