2015-12-10 1 views
0

Мне нужно сделать сравнение для оценок в два момента времени и указать, было ли изменение вверх, вниз или оставалось неизменным. Например:Могу ли я установить правила для сравнения строк в SQL? (или мне нужно жестко кодировать с использованием CASE КОГДА)

Это будет таблица с четырьмя столбцами:

ID T0 T0+1  Status 
1 AAA AA  Lower 
2 BB A  Higher 
3 C  C  Same 

Однако, это не работает при применении регулярного сравнения строк, потому что в SQL

A<B 
B<BBB 

Мне нужно

A>B 
B<BBB 
  • S О мой заказ (от высшего к низшему): AAA, AA, A, BBB, BB, B
  • заказ SQL (от высшего к низшему): BBB, BB, B, AAA, AA, A

Теперь я есть 2 варианта в виду, но мне интересно, если кто-то знает лучше один:

1) Используйте случай, когда заявления для всех возможностей оценки вверх и вниз (у меня есть несколько значений, чем indictaed выше)

CASE WHEN T0=T0+1 then 'Same' 
WHEN T0='AAA' and To+1<>'AAA' then 'Lower' 

.... адрес все остальные варианты снижения рейтинга

ELSE 'Higher' 

Однако это порождает очень большое число операторов CASE WHEN.

2) Мой другой вариант требует генерации 2 таблиц. В таблице 1 я использую случай, когда операторы присваивают значения/ранг рейтингам. Например:

CASE WHEN T0='AAA' then 6 
CASE WHEN T0='AA' then 5 
CASE WHEN T0='A' then 4 
CASE WHEN T0='BBB' then 3 
CASE WHEN T0='BB' then 2 
CASE WHEN T0='B' then 1 
The same for T0+1. 

Затем в таблице 2 я использовать обычный compariosn между колонке T0 и столбца T0 + 1 на числовые значения.

Однако я ищу решение, где я могу сделать это в одном столе (с минимальными строками), и оптимально никогда не показывать столбец рейтинга. Я думаю, что вложенное утверждение будет лучшим вариантом, но теперь это работает для меня.

У кого-нибудь есть предложения?

Я использую SQL Server 2008.

+1

Я думаю, что вариант 2 лучше, чем вариант 1. Более компактным решением будет таблица поиска со столбцами для оценки («AAA», «AA», «A» и т. Д.) И значение сортировки рейтинга. Я бы рекомендовал отдельную таблицу, если вам нужна эта логика в других запросах. –

+0

создайте таблицу сопоставления, в которой есть текстовая строка и столбец с указанием порядка, в котором они должны быть. Присоединяйтесь к этой таблице и закажите наш столбец OrderBy. – Jeremy

+0

Yup, lookup/mapping table - это, безусловно, путь. –

ответ

0

Если вы используете Credit Rating, это очень вероятно, что это не просто ААА> АА или ВВВ> BB.

Если вы используете одно агентство или другое, это может быть AA + или Aa1 на длительный срок, F1 + на короткий срок или что-то еще в разных контекстах или с другими агентствами.

Также часто требуется конвертировать данные из одного агентства в другое агентство.

Поэтому лучше использовать таблицу отображения, такие как:

Id | Rating 
0 | AAA 
1 | AA+ 
2 | AA 
3 | AA- 
4 | A+ 
5 | A 
6 | A- 
7 | BBB+ 

Используя эту таблицу, вы только присоединиться рейтинг в таблице данных с рейтингом в таблице отображения:

SELECT d.Rating_T0, d.Rating_T1 
    CASE WHEN d.Rating_T0 = d.Rating_T1 THEN '=' 
     WHEN m0.id < m1.id THEN '<' 
     WHEN m0.id > m1.id THEN '>' 
    END 
FROM yourData d 
INNER JOIN RatingMapping m0 
    ON m0.Rating= d.Rating_T0 
INNER JOIN RatingMapping m1 
    ON m1.Rating= d.Rating_T1 

Если вы сохраняете только идентификатор рейтинга в своей таблице данных, вы не только сэкономите пространство (1 байт для tinyint против 4 символов), но также сможете сравнивать без JOIN с таблицей сопоставления.

SELECT d.Rating_Id0, d.Rating_Id1 
    CASE WHEN d.Rating_Id0 = d.Rating_Id1 THEN '=' 
     WHEN d.Rating_Id0 < d.Rating_Id1 THEN '<' 
     WHEN d.Rating_Id0 > d.Rating_Id1 THEN '>' 
    END 
FROM yourData d 

Соединить будет только тогда, когда взыскательных вы хотите отобразить фактическое значение рейтинга, такие как AAA для Rating_ID = 0.

Вы также можете добавить agency_Id в таблицу сопоставления. Таким образом, вы можете легко выбрать, какое агентство нотации вы хотите отображать и легко конвертировать между Агентством 1 и Агентством 2 или Агентством 3 (то есть Id 1 => S & P и Id 2 => Fitch, Id 3 => ...)

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