T-SQL如果值存在则使用其他方式使用之前的值

时间:2011-10-17 13:12:04

标签: tsql

我有下表

  

-----帐户#----期间-----余额

     
      
  • 12345 --------- 200901 ----- $ 11554
  •   
  • 12345 --------- 200902 ----- $ 4353
  •   
  • 12345 -------- 201004 ----- $ 34
  •   
  • 12345 -------- 201005 ----- $ 44
  •   
  • 12345 --------- 201006 ----- $ 1454
  •   
  • 45677 --------- 200901 ----- $ 14454
  •   
  • 45677 --------- 200902 ----- $ 1478
  •   
  • 45677 -------- 201004 ----- $ 116776
  •   
  • 45677 -------- 201005 ----- $ 996
  •   
  • 56789 --------- 201006 ----- $ 1567年
  •   
  • 56789 --------- 200901 ----- $ 7894
  •   
  • 56789 --------- 200902 ----- $ 123
  •   
  • 56789 -------- 201003 ----- $ 543345
  •   
  • 56789 -------- 201005 ----- $ 114
  •   
  • 56789 --------- 201006 ----- $ 54
  •   

我想选择期限为201005的帐户#。 使用下面的代码非常简单。 问题是,如果用户输入201003 - 其中不存在 - 我希望查询选择以前的值。* 请注意,有一个帐户#具有201003期间且我仍然我也想选择它。 *
我试过CASE,IF ELSE,IN但是我没有成功。 PS:由于5000行的系统限制,我无法创建临时表。 谢谢。

DECLARE @INPUTPERIOD INT
@INPUTPERIOD ='201005'

SELECT ACCOUNT#, PERIOD , BALANCE
FROM TABLE1
WHERE PERIOD =@INPUTPERIOD

3 个答案:

答案 0 :(得分:0)

select top 1 account#, period, balance
from table1
where period >= @inputperiod

答案 1 :(得分:0)

SELECT t.ACCOUNT#, t.PERIOD, t.BALANCE
    FROM (SELECT ACCOUNT#, MAX(PERIOD) AS MaxPeriod
              FROM TABLE1
              WHERE PERIOD <= @INPUTPERIOD
              GROUP BY ACCOUNT#) q
        INNER JOIN TABLE1 t
            ON q.ACCOUNT# = t.ACCOUNT#
                AND q.MaxPeriod = t.PERIOD

答案 2 :(得分:0)

; WITH Base AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY Period DESC) RN FROM #MyTable WHERE Period <= 201003
)

SELECT * FROM Base WHERE RN = 1

使用CTE和ROW_NUMBER()(我们采用Period&lt; =所选日期的所有行,我们采取前一个(自动生成的ROW_NUMBER()= 1)

; WITH Base AS
(
    SELECT *, 1 AS RN FROM #MyTable WHERE Period = 201003
)
, Alternative AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY Period DESC) RN FROM #MyTable WHERE NOT EXISTS(SELECT 1 FROM Base) AND Period < 201003
)
, Final AS
(
    SELECT * FROM Base
    UNION ALL
    SELECT * FROM Alternative WHERE RN = 1
)

SELECT * FROM Final

这个更复杂但几乎完全相同。它更像“势在必行”。它首先尝试查找具有确切Period的行,如果它不存在则与之前相同。最后,它将两个结果集联合起来(两个中的一个总是为空)。我总是使用第一个,除非分析显示我的SQL无法理解我正在尝试做什么。然后我会尝试第二个。