2015-03-11 2 views
3

Существующие данные:SQL СНП попеременным ГОД

 
RowId Title Year 
1  Aaa 2002 
2  Bbb 2003 
3  Ccc 2004 
4  Ddd 2004 
5  Eee 2005 
6  Fff 2006 
7  Ggg 2007 
8  Hhh 2008 

У меня есть необходимость для извлечения данных из таблицы на основе входного параметра, год следующим образом:

1. Select all records matching param year 
    2. Select all records matching param year +1 
    3. Select all records matching param year -1 
    4. Select all records matching param year +2 
    5. Select all records matching param year -2 
    6. Select all records matching param year +3 
    7. Select all records matching param year -3 

Ожидаемые результаты (при условии, что в этом году - 2005 год):

 
RowId Title Year 
5  Eee 2005 
6  Fff 2006 
3  Ccc 2004 
4  Ddd 2004 
7  Ggg 2007 
2  Bbb 2003 
8  Hhh 2008 
1  Aaa 2002 

Я смог достичь этого, используя несколько SELECT на одном столе с UNION, но интересно, есть ли лучший способ сделать это.

Цените свою помощь!

ответ

1
SELECT * FROM TableName 
WHERE Year = @Year Or 
     Year = @Year - 1 Or 
     Year = @Year + 1 Or 
     Year = @Year - 2 Or 
     Year = @Year + 2 Or 
     Year = @Year - 3 Or 
     Year = @Year + 3 
ORDER BY ABS(Year - @Year) 
+0

Это где предложение действительно многословно: 'где Year between (@year - 3) и (@yea r + 3) 'должен делать. Кроме того, порядок заказа не достаточно. Рассмотрим случай, когда @year = 2006. 'ABS (@year - 2005)' и 'ABS (@year - 2007)' оба дают 1, поэтому они рассматриваются как равные по порядку by и поэтому могут быть возвращены в любой заказ. Если вы выберете второй критерий выбора года, это должно сделать это. –

+0

@BenThul, да, вы правы. Это было опубликовано через панель, поэтому я не смог ее протестировать. –

3

Предполагая Year является целым числом:

declare @param int 

select * 
from mytable 
where Year = @param 
or Year = @param + 1 
or Year = @param - 1 
-- etc. 
order by abs(Year - @param), Year - @param desc, Title 

Первый пункт в order by сортов по величине разности между Year и @param, а второй делает уверен, что положительные различия возникают прежде, чем отрицательные.

+0

Благодарим за быстрый ответ! – user2980765

0

вы должны изменить 2005 для пар, но это должно работать

select rowid, title, year FROM 
(
select rowid, title, year, (year - 2005) c1, ABS (year - 2005) c2 from a 
) t1 
    order by t1.c2, t1.c1 desc 

http://sqlfiddle.com/#!6/b42d0/4

Смежные вопросы