SELECT ... 繳費狀態, .... FROM
改成 MAX(繳費狀態)
並把 sql 中 繳費狀態
欄位從 Group By
移除
假如你是看日期來判斷最新繳費狀態
請使用 ROW_NUMBER
window function 取得最新一筆 入賬日期
SELECT *
FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY "grouping 欄位..." ORDER BY 入賬日期 DESC) rn
FROM T
) t1
WHERE rn = 1
看來是使用Oracle
create table t1 (
uname varchar2(20)
, paystat int
, paydate date
);
insert all
into t1 values ('林佳穎', 0, to_date('2022-07-13 15:30:01', 'YYYY-MM-DD HH24:MI:SS'))
into t1 values ('林佳穎', 1, to_date('2022-07-14 10:10:01', 'YYYY-MM-DD HH24:MI:SS'))
into t1 values ('翁翠霙', 0, to_date('2022-07-13 14:10:00', 'YYYY-MM-DD HH24:MI:SS'))
into t1 values ('劉瑞豐', 0, to_date('2022-07-13 11:40:02', 'YYYY-MM-DD HH24:MI:SS'))
select 1
from dual;
select a.uname
, decode(greatest(a.paystat,nvl(b.paystat, 0)), 1, '已繳', '未繳') as chkpay
, decode(greatest(a.paystat,nvl(b.paystat, 0)), 1
, to_char(b.paydate, 'YYYY-MM-DD HH24:MI:SS')
, to_char(a.paydate, 'YYYY-MM-DD HH24:MI:SS')
) as paydate
from (select uname, paystat, paydate
from t1
where paystat = 0) a
left outer join
(select uname, paystat, paydate
from t1
where paystat = 1) b
on a.uname = b.uname;
UNAME CHKPAY PAYDATE
林佳穎 已繳 2022-07-14 10:10:01
劉瑞豐 未繳 2022-07-13 11:40:02
翁翠霙 未繳 2022-07-13 14:10:00
select uname
, decode(max(paystat),1, '已繳', '未繳') as chkpay
, to_char(max(paydate), 'YYYY-MM-DD HH24:MI:SS') as paydate
from t1
group by uname;
UNAME CHKPAY PAYDATE
林佳穎 已繳 2022-07-14 10:10:01
翁翠霙 未繳 2022-07-13 14:10:00
劉瑞豐 未繳 2022-07-13 11:40:02
因為提供的資料有限,語法是建立在名字不重複的前提下.
SELECT 單號, 繳款人名稱, SUM(繳款狀態)
FROM payment_transactions GROUP BY 單號
SUM(繳款狀態) == 0 -> not yet payment
SUM(繳款狀態) == 1 -> payment succeed
我來寫一段
慣用的是 MS SQL 的解方...
SELECT pid, name, stat, way, dt into #tb01 from table WHERE 1=1
-- 唯一編號, 姓名, 狀態碼, 繳款方式, 時間 + WHERE 條件區間
SELECT a.*, CASE a.stat WHEN 1 THEN '已繳' ELSE '未付款' END pay_stat FROM #tb01 a JOIN (SELECT pid, max(dt) mdt FROM #tb01 )b ON a.pid=b.pid and a.dt=b.mdt
DROP TABLE #tb01;
以上一串作法,即可一次解決。