Объединение двух уже работающих запросов ORACLE - PullRequest
0 голосов
/ 06 сентября 2011

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

Они оба обслуживают базу данных карт лояльности.

Первый получает различную информацию о пользователе, основываясь на его уникальномномер карты (% 1111% , % 2222% , % 3333% в приведенном ниже примере) и возвращает строки в произвольном порядке в которых были указаны номера карт.

SELECT cardnumber, first_name || ' ' || last_name 
FROM (
     SELECT cardnumber, first_name, last_name, c.OrderNo
     FROM ag_cardholder ch, (SELECT '%1111%' cardmask, 1 OrderNo from dual
                        UNION ALL
                        SELECT '%2222%', 2 OrderNo from dual
                        UNION ALL
                        SELECT '%3333%', 3 OrderNo from dual
                        ) c
     WHERE ch.cardnumber LIKE c.cardmask
     Order by c.OrderNo
) t

Второй код возвращает баланс текущих баллов карты на основе номера карты и типа терминала, который последний раз использовался для записи точеккарта.Существуют два типа терминалов , которые по-разному рассчитывают фактический баланс (одному из них нужно число в столбце balance , другому нужно sum balance и total_points столбцы).

SELECT *
FROM
(SELECT
cardnumber,
(SELECT last_name || ' ' || first_name FROM ag_cardholder WHERE cardnumber = '1111'),
CASE
WHEN terminal_id LIKE 'AGHUPR9%' THEN card_balance
WHEN terminal_id LIKE 'AGHUPR7%' THEN card_balance + total_points
END
FROM ag_tranzakcio
WHERE cardnumber = '1111'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1

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

ОБНОВЛЕНИЕ: К сожалению, я недостаточно знаком с ORACLE, чтобы придумать даже решение для проб и ошибок, поэтому теперь я полагаюсь на ваше понимание.

Ответы [ 2 ]

1 голос
/ 07 сентября 2011
SELECT cardnumber, name, balance, OrderNo
FROM
(
    SELECT 
    ch.cardnumber cardnumber, 
    ch.first_name || ' ' || ch.last_name name, 
    CASE WHEN t.terminal_id LIKE 'AGHUPR9%' THEN t.card_balance 
         WHEN t.terminal_id LIKE 'AGHUPR7%' THEN t.card_balance + t.total_points 
    END balance,
    rank () over (partition by ch.cardnumber order by t.tran_date DESC) rank,
    c.OrderNo as OrderNo
    FROM ag_cardholder ch
    JOIN (SELECT '%1111%' cardmask, 1 OrderNo from dual
                                UNION ALL
                                SELECT '%2222%', 2 OrderNo from dual
                                UNION ALL
                                SELECT '%3333%', 3 OrderNo from dual
                                ) c ON ch.cardnumber like c.cardmask
    JOIN ag_tranzakcio t ON ch.cardnumber = t.cardnumber 
)
WHERE rank = 1
ORDER BY OrderNo

РЕДАКТИРОВАТЬ: Предполагая, что поле ag_tranzakcio.id является надежным инкрементным ключом, это может работать:

SELECT cardnumber, name, balance, OrderNo
FROM
(
    SELECT 
    ch.cardnumber cardnumber, 
    ch.first_name || ' ' || ch.last_name name, 
    CASE WHEN t.terminal_id LIKE 'AGHUPR9%' THEN t.card_balance 
         WHEN t.terminal_id LIKE 'AGHUPR7%' THEN t.card_balance + t.total_points 
    END balance,
    rank () over (partition by ch.cardnumber order by t.id DESC) rank,
    c.OrderNo as OrderNo
    FROM ag_cardholder ch
    JOIN (SELECT '%1111%' cardmask, 1 OrderNo from dual
                                UNION ALL
                                SELECT '%2222%', 2 OrderNo from dual
                                UNION ALL
                                SELECT '%3333%', 3 OrderNo from dual
                                ) c ON ch.cardnumber like c.cardmask
    JOIN ag_tranzakcio t ON ch.cardnumber = t.cardnumber 
)
WHERE rank = 1
ORDER BY OrderNo
1 голос
/ 06 сентября 2011

Пересмотренное требование - возвращать только самые последние транзакции для каждой карты.Это можно сделать, используя аналитическую функцию RANK () для сортировки транзакций, а затем применив запрос обертки для фильтрации по вычисленному рангу.

select cardnumber
       , card_holder
       , txn_amount
from 
    (
    SELECT ch.cardnumber
           , ch.first_name || ' ' || ch.last_name  as card_holder
           , CASE
                WHEN txn.terminal_id LIKE 'AGHUPR9%' THEN txn.card_balance
                WHEN txn.terminal_id LIKE 'AGHUPR7%' THEN txn.card_balance + txn.total_points
            END as txn_amount
           , rank () over (partition by ch.cardnumber order by txn.tran_date DESC) as rnk       
            , c.orderno
    FROM ag_cardholder ch
         join    (SELECT '%1111%' cardmask, 1 OrderNo from dual
                            UNION ALL
                            SELECT '%2222%', 2 OrderNo from dual
                            UNION ALL
                            SELECT '%3333%', 3 OrderNo from dual
                            ) c 
            on (ch.cardnumber LIKE c.cardmask)
         join ag_tranzakcio txn
            on (ch.cardnumber = txn.cardnumber)
    )        
where rnk=1       
order by orderno, cardnumber  
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...