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,然後讓長...