Oracle SQL Query для получения RAG - PullRequest
0 голосов
/ 12 февраля 2019
RAG    PCT
------ ---
GREEN  100
AMBER   50
ORANGE  20
RED      0

Мне нужен запрос оракула, чтобы результат был похож (Предлагаю использовать внутреннее или внешнее соединение)

if the given PCT >100 then Green
if the given PCT >=50 and PCT < 100 then AMBER
if the given PCT >=20 and PCT < 0 then ORANGE
else RED

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

То, что вы просите, не совсем имеет смысла - вы сказали «Использовать объединение», но не предоставили ничего, чтобы присоединиться к , но не берите в голову.Следующее строго реализует вашу спецификацию:

WITH cteData AS (SELECT 'GREEN' AS RAG, 100 AS PCT FROM DUAL UNION ALL
                 SELECT 'AMBER', 50 FROM DUAL UNION ALL
                 SELECT 'ORANGE', 20 FROM DUAL UNION ALL
                 SELECT 'RED', 0 FROM DUAL)
SELECT RAG, PCT, CASE
                   WHEN PCT > 100 THEN 'GREEN'
                   WHEN PCT >= 50 AND PCT < 100 THEN 'AMBER'
                   WHEN PCT >= 20 AND PCT < 0 THEN 'ORANGE'
                   ELSE 'RED'
                 END AS COLOR
  FROM cteData;

При выполнении вышеприведенного выдает:

RAG     PCT COLOR
GREEN   100 RED
AMBER   50  AMBER
ORANGE  20  RED
RED     0   RED

И пусть Кодд помилует вашу душу.

0 голосов
/ 12 февраля 2019

Если я вас правильно понимаю, я думаю, это может быть что-то вроде того, что вы ищете:

WITH rag_data AS (SELECT 'GREEN' AS rag, 100 AS PCT FROM DUAL UNION ALL
                  SELECT 'AMBER' AS rag, 50 AS PCT FROM DUAL UNION ALL
                  SELECT 'ORANGE' AS rag, 20 AS PCT FROM DUAL UNION ALL
                  SELECT 'RED' AS rag, 0 AS PCT FROM DUAL),
  sample_data AS (SELECT -1 NUM FROM dual UNION ALL
                  SELECT 0 NUM FROM dual UNION ALL
                  SELECT 1 NUM FROM dual UNION ALL
                  SELECT 19 NUM FROM dual UNION ALL
                  SELECT 20 NUM FROM dual UNION ALL
                  SELECT 21 NUM FROM dual UNION ALL
                  SELECT 49 NUM FROM dual UNION ALL
                  SELECT 50 NUM FROM dual UNION ALL
                  SELECT 51 NUM FROM dual UNION ALL
                  SELECT 99 NUM FROM dual UNION ALL
                  SELECT 100 NUM FROM dual UNION ALL
                  SELECT 101 NUM FROM dual)
SELECT NUM,
       rag,
       pct,
       rn
FROM   (SELECT sd.num,
               rd.rag,
               rd.pct,
               row_number() OVER (PARTITION BY sd.num ORDER BY rd.pct DESC) rn
        FROM   sample_data sd
               INNER JOIN rag_data rd ON sd.num >= rd.pct)
WHERE  rn = 1;

       NUM RAG           PCT         RN
---------- ------ ---------- ----------
         0 RED             0          1
         1 RED             0          1
        19 RED             0          1
        20 ORANGE         20          1
        21 ORANGE         20          1
        49 ORANGE         20          1
        50 AMBER          50          1
        51 AMBER          50          1
        99 AMBER          50          1
       100 GREEN         100          1
       101 GREEN         100          1
0 голосов
/ 12 февраля 2019

Вы можете реализовать логику, используя CASE, например:

SELECT pct, CASE 
    WHEN pct >= 100 THEN 'GREEN'
    WHEN pct >= 50 THEN 'AMBER'
    WHEN pct >= 20 then 'ORANGE'
    ELSE 'RED'
END
FROM mytable

CASE останавливается на первом условии соответствия (следовательно, нет необходимости писать WHEN pct >= 50 AND pct < 100, например, так как pct >= 100 являетсяуже перехвачено предыдущим условием.


Если вы используете отдельную таблицу для хранения нижней границы каждого интервала (например, myranges), как показано в вашем примере, и вы ищете JOIN это с таблицей, которая содержит фактические данные (например, mydata), тогда это немного сложнее: вам нужно убедиться, что вы объединяетесь с соответствующей записью диапазона:

SELECT d.*, r.*
FROM mydata d
INNER JOIN myranges r 
    ON d.value >= r.pct 
    AND (
        LEAD (r.pct) OVER (ORDER BY pct) IS NULL
        OR d.value < LEAD (r.pct) OVER (ORDER BY pct)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...