iT邦幫忙

0

SQL選擇及條件查詢

sql
  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20220725/20137810hGOzWrt5XV.jpg

由於我們的專案設計,當一筆繳費單產生時會是未繳費狀態,為0
而完成繳費後會再新增一筆新的一樣的資料,只有狀態會變成1
但現在問題來了,如果說,我想查出「已繳費」及「未繳費」的資料
我該怎麼查出已繳費的狀態1,而不要查出他的0的那筆的?
同時也可以查出未繳費,只有一筆狀態為0的資料
用了一些NVL 或NULL GROUP BY等等語法好像都不太是我要的效果,
或是我用的不對><
請問有大大寫過類似的語法嗎?

featherm iT邦新手 5 級 ‧ 2022-07-25 16:56:54 檢舉
你總有個單號吧?依照單號去篩選啊
我就用單號去查阿,單號就會有未繳費跟已繳費狀態阿..
subquery 先取 COUNT(單號) > 1,在JOIN單號WHERE 繳款狀態=1
這樣呢
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
石頭
iT邦高手 1 級 ‧ 2022-07-25 16:43:37

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
0

其實,沒看到你的SQL語法。
我還真沒辦法告訴你要怎麼改對還是不對耶!!

1
一級屠豬士
iT邦大師 1 級 ‧ 2022-07-25 20:13:23

看來是使用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

demo

因為提供的資料有限,語法是建立在名字不重複的前提下.

0
SELECT 單號, 繳款人名稱, SUM(繳款狀態) 
FROM payment_transactions GROUP BY 單號

SUM(繳款狀態) == 0 -> not yet payment
SUM(繳款狀態) == 1 -> payment succeed

0
kw6732
iT邦研究生 5 級 ‧ 2022-07-26 12:27:15

我來寫一段
慣用的是 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;

以上一串作法,即可一次解決。

0
dd2019
iT邦新手 5 級 ‧ 2022-08-01 17:53:47

SELECT 繳款人名稱, SUM(繳款狀態)
FROM X
GROUP BY 繳款人名稱

我要發表回答

立即登入回答