LeetCode 1205 每月交易II(中等)

2021-10-03 14:42:38 字數 3172 閱讀 4225

transactions 記錄表

chargebacks 表

+----------------+---------+

| column name    | type    |

+----------------+---------+

| trans_id       | int     |

| charge_date    | date    |

+----------------+---------+

退單包含有關放置在事務表中的某些事務的傳入退單的基本資訊。

trans_id 是 transactions 表的 id 列的外來鍵。

每項退單都對應於之前進行的交易,即使未經批准。

編寫乙個 sql 查詢,以查詢每個月和每個國家/地區的已批准交易的數量及其總金額、退單的數量及其總金額。

注意:在您的查詢中,給定月份和國家,忽略所有為零的行。

查詢結果格式如下所示:

chargebacks 表:

+------------+------------+

| trans_id   | trans_date |

+------------+------------+

| 102        | 2019-05-29 |

| 101        | 2019-06-30 |

| 105        | 2019-09-18 |

+------------+------------+

審題:編寫乙個 sql 查詢,以查詢每個月和每個國家/地區的已批准交易的數量及其總金額、退單的數量及其總金額。

每個月,每個國家,批准的數量及總額,退單的數量及總額。

思考:批准的數量查詢狀態,如果為批准就是。分組求和問題。退單的數量需要根據退單錶查詢,屬於分組並且在退單錶的數量。

解題:union:對兩個結果集進行並集操作,不包括重複行,同時進行預設規則的排序;

union all:對兩個結果集進行並集操作,包括重複行,不進行排序;

這道題的的思路就是

先查出 每個月和每個國家/地區的已批准交易的數量及其總金額

select country,state,amount,date_format(t.trans_date,'%y-%m') as month,0  as tag

from transactions t where state!='declined'

-- 練習

select county,state,amount,date_format(t.trans_date,'%y-%m') as month,0 as tag

from transactions t where state! = 'declined';

再查出 每個月和每個國家/地區的退單的數量及其總金額 

select country,state,amount,date_format(c.trans_date,'%y-%m') as month,1 as tag

from transactions t

right join chargebacks c on t.id=c.trans_id

-- 退單的數量及總額

on t.id = c.trans_id

進行合併,只靠左右關聯是完成不了的, 因為它要求chargebacks裡面的trans_date也要計入進去,

注意合併的時候 不要用union 這個會將重複行覆蓋掉,判斷是否重複行就是 國家 年月 金額 均一致 這是很容易發生的

最後count統計,sum求和,分組排序

這裡用了tag去區分 是交易還是退單 ,方便合併之後統計

select month,

country,

count(case when tag=1 then 1 else null end ) as chargeback_count,

sum(case when tag=1 then amount else 0 end ) as chargeback_amount

from(

select country,state,amount,date_format(c.trans_date,'%y-%m') as month,1 as tag

from transactions t

right join chargebacks c on t.id=c.trans_id

union all

select country,state,amount,date_format(t.trans_date,'%y-%m') as month,0 as tag

from transactions t where state!='declined'

) a group by country,month order by month,country

方法二:

-- write your mysql query statement below

select date_format(a.trans_date, '%y-%m') as month, a.country

, count(case

else null

else 0

, count(case

when state is null then 1

else null

end) as chargeback_count, sum(case

when state is null then amount

else 0

end) as chargeback_amount

from (

select *

from transactions

union all

select a.trans_id as id, b.country, null, b.amount, a.trans_date

from chargebacks a

join transactions b on a.trans_id = b.id

) awhere a.state != 'declined' or a.state is null

group by a.country, date_format(a.trans_date, '%y-%m')

知識點:

160 相交鍊錶 leetcode

編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3輸出 reference of the node with value...

LeetCode160 相交鍊錶

編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅用 o 1 記憶體。解題思路 1.找到兩個鍊錶長度差n後...

Leetcode160 相交鍊錶

解法一 用乙個集合去判斷 class solution sets listnode tmp1 heada listnode tmp2 headb while tmp1 while tmp2 tmp2 tmp2 next return nullptr 解法二 先遍歷一遍兩個鍊錶得到的長度差n,然後讓長...