我有下表
-----帐户#----期间-----余额
- 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
答案 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无法理解我正在尝试做什么。然后我会尝试第二个。