Присоединение к таблице, которая не имеет диапазонов, но требует диапазонов - PullRequest
2 голосов
/ 03 августа 2011

Пытаясь найти лучший способ написать эту инструкцию SQL.

У меня есть таблица клиентов с внутренним кредитным рейтингом этого клиента. Тогда у меня есть другая таблица с определениями этого кредитного рейтинга. Я хотел бы объединить эти таблицы, но во второй таблице нет способа легко связать их.

Оценка клиента - это целое число от 1 до 999, а в таблице определения есть следующие столбцы:

Score
Description

И эти строки:

60   LOW
99   MED
999  HIGH

Таким образом, в основном, если у клиента оценка от 1 до 60, он низкий, 61-99 - мед, и 100-999 - высокий.

Я не могу действительно присоединиться к ним, потому что он присоединился бы к ним, только если счет был 60, 99 или 999, и это исключило бы кого-либо еще с такими счетами.

Я не хочу делать case-заявление со статическими числами, потому что наши оценки могут измениться в будущем, и я не хочу обновлять мой начальный запрос, когда / если они это сделают. Я также не могу создать какие-либо таблицы или функции для этого - мне нужно создать оператор SQL, чтобы сделать это для меня.

EDIT:

Коллега сказал, что это сработает, но это немного сумасшествие. Я думаю, что должен быть лучший способ:

SELECT 
  internal_credit_score
  (
    SELECT
      credit_score_short_desc
    FROM
      cf_internal_credit_score
    WHERE
      internal_credit_score = (
                                SELECT 
                                  max(credit.internal_credit_score) 
                                FROM 
                                  cf_internal_credit_score credit  
                                WHERE 
                                  cs.internal_credit_score <= credit.internal_credit_score
                                  AND credit.internal_credit_score <= (
                                                                        SELECT
                                                                          min(credit2.internal_credit_score)
                                                                        FROM
                                                                          cf_internal_credit_score credit2
                                                                        WHERE
                                                                          cs.internal_credit_score <= credit2.internal_credit_score
                                                                      )
                              )
  )
FROM 
  customer_statements cs

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

попробуйте это, измените вашу таблицу так, чтобы она содержала диапазон оценок:

ScoreTable
-------------
LowScore int
HighScore int
ScoreDescription string

значения данных

LowScore HighScore ScoreDescription 
-------- --------- ----------------
1        60        Low
61       99        Med
100      999       High

запрос:

Select
    .... , Score.ScoreDescription 
    FROM YourTable
    INNER JOIN Score ON YourTable.Score>=Score.LowScore 
        AND YourTable.Score<=Score.HighScore
    WHERE ...
2 голосов
/ 03 августа 2011

Если ваша таблица называется CreditTable, это то, что вы хотите:

select * from
(
    select Description, Score
    from CreditTable
    where Score > 80 /*client's credit*/
    order by Score
)
where rownum = 1

Кроме того, убедитесь, что ваш эталонный показатель равен 1000, хотя наивысший возможный балл клиента составляет 999.

Обновление

Приведенный выше SQL дает кредитную запись для данного значения. Если вы хотите присоединиться, скажем, к таблице Clients, вы должны сделать что-то вроде этого:

select 
  c.Name,
  c.Score,
  (select Description from 
      (select Description from CreditTable where Score > c.Score order by Score)
   where rownum = 1)
from clients c

Я знаю, что это подвыбор, который выполняется для каждой возвращаемой строки, но, опять же, CreditTable смехотворно мал, и не будет существенной потери производительности из-за использования подвыбора.

1 голос
/ 03 августа 2011

Вы можете использовать аналитические функции для преобразования данных в вашей таблице описания оценок в диапазоны (я предполагаю, что вы имели в виду, что 100-999 должен отображаться в 'ВЫСОКИЙ', а не 99-999).

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select 60 score, 'Low' description from dual union all
  3    select 99, 'Med' from dual union all
  4    select 999, 'High' from dual
  5  )
  6  select description,
  7         nvl(lag(score) over (order by score),0) + 1 low_range,
  8         score high_range
  9*   from x
SQL> /

DESC  LOW_RANGE HIGH_RANGE
---- ---------- ----------
Low           1         60
Med          61         99
High        100        999

Затем вы можете присоединить это к вашей CUSTOMER таблице с чем-то вроде

SELECT c.*, 
       sd.*
  FROM customer c,
       (select description,
               nvl(lag(score) over (order by score),0) + 1 low_range,
               score high_range
          from score_description) sd
 WHERE c.credit_score BETWEEN sd.low_range AND sd.high_range
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...