我们公司有一个会员卡数据库。该卡系统由全国两种类型的终端服务。麻烦的是,两个终端以不同的方式计算当前的点平衡。
我想创建一个查询,首先按日期查找单个用户的事务列表的最后一行,然后检查终端的ID,并根据ID,从同一行返回卡余额。 / p>
这两种类型的终端可以这样表达:
terminal_id LIKE 'AGHUPR9%'
terminal_id LIKE 'AGHUPR7%'
AGHUPR9%只能从名为 card_balance 的列中获得余额。 AGHUPR7%需要求和 card_balance 和 total_points 列才能获得当前余额。
我编写了查询的主要部分,但我对ORACLE不够熟悉所以我不知道如何在语法上将它们组合起来。这是我非常感谢你的帮助。以下是我提出的建议,评论中我不确定所需的代码。
SELECT *
FROM
(SELECT terminal_id
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1
如果以上语句返回以AGHUPR9开头的terminal_id,执行此操作:
SELECT *
FROM
(SELECT card_balance
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1
如果第一个语句返回以AGHUPR7开头的terminal_id,执行此操作:
SELECT *
FROM
(SELECT card_balance+total_points
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1
如何将它们组合成一个有效的查询?我试图使用 CASE 但收效甚微。
提前谢谢。
答案 0 :(得分:1)
只需使用CASE声明。
SELECT *
FROM
(SELECT
CASE
WHEN terminal_id LIKE 'AGHUPR9%' THEN card_balance
ELSE card_balance+total_points
END AS card_balance
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1
当card_balance
以“AGHUPR9”开头时,这将使用terminal_id
,否则它将使用card_balance+total_points
,在任何一种情况下都会在名为“card_balance”的列中返回答案。< / p>