T-SQL, если значение существует, используйте его, иначе используйте значение перед - PullRequest
0 голосов
/ 17 октября 2011

У меня есть следующая таблица

----- Счет № ---- Период ----- Баланс

  • 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, который не существует, я хочу, чтобы запрос выбрал предыдущее значение . * ПРИМЕЧАНИЕ.чтобы выбрать его тоже. *
Я пробовал CASE, IF ELSE, IN, но мне не удалось.PS: я не могу создавать временные таблицы из-за системных ограничений в 5000 строк.Спасибо.

DECLARE @INPUTPERIOD INT
@INPUTPERIOD ='201005'

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

Ответы [ 3 ]

0 голосов
/ 17 октября 2011
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
0 голосов
/ 17 октября 2011
; 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 <= выбранной датой и выбираем верхнюю (ту, с автоматически сгенерированной ROW_NUMBER () = 1) </p>

; 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

Этот намного сложнее, но делает почти то же самое. Он более "императивен, как". Сначала он пытается найти строку с точным Периодом, и, если он не существует, делает то же самое, что и раньше.В конце он объединяет два набора результатов (один из двух всегда пуст). Я всегда использовал бы первый, если бы профилирование не показало мне, что SQL не смог понять, что я пытаюсь сделать. Затем япопробую второй.

0 голосов
/ 17 октября 2011
select top 1 account#, period, balance
from table1
where period >= @inputperiod
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...