[英]Getting ratios in mysql without subqueries
我想從下表中運行一個查詢,得到從執行辦公室支付的金額與應付總金額的比率:
CREATE TABLE offices (
name VARCHAR(255),
ID VARCHAR(255),
level VARCHAR(255)
);
INSERT INTO offices (name,ID,level)
VALUES
('chairman', 'ad1', 'admin'),
('MD', 'ad2', 'admin'),
('CEO', 'ad3', 'admin'),
('president', 'ex1', 'exec' ),
('VP', 'ex2', 'exec'),
('GM', 'ex3', 'exec'),
('HOD', 'ex4', 'exec');
CREATE TABLE cheques (
payee VARCHAR(255) ,
officeID VARCHAR(255),
amount INT(),
status VARCHAR(255)
);
INSERT INTO cheques
VALUES ('john', 'ad2', '100', 'paid'),
('john', 'ad3', '50', 'owed'),
('john', 'ex3', '80', 'paid'),
('john', 'ex4', '150', 'owed'),
('john', 'ex1', '35', 'paid'),
('mary', 'ad1', '200', 'paid'),
('mary', 'ad3', '90', 'owed'),
('mary', 'ex2', '110', 'paid'),
('mary', 'ex4', '40', 'owed'),
('mary', 'ex1', '60', 'paid'),
('jane', 'ad1', '75', 'paid'),
('jane', 'ad3', '120', 'paid');
預期結果如下:
data.frame(
payee=c("john","mary"),
totalpaid=c(115,170),
status=c("paid", "paid"),
totalsdue = c(415, 500),
ratio=(0.28, 0.34)
)
我已經能夠從以下執行辦公室獲得總薪水
SELECT c.payee, SUM(c.amount) as totalpaid, c.status
FROM cheques c
JOIN offices o
ON c.officeID = o.ID
WHERE
o.level LIKE '%ex%'
AND
c.status LIKE '%paid%'
GROUP BY payee
和總欠款如下
SELECT c.payee, SUM(c.amount) as totalsdue
FROM cheques c
GROUP BY payee
我沒有成功的嘗試:
SELECT
c.payee, SUM(c.amount) as totalsdue
totalsdue/totalpaid as ratio
FROM cheques c
WHERE c.payee IN
(SELECT c.payee, SUM(c.amount) as totalpaid, c.status
FROM cheques c
JOIN offices o
ON c.officeID = o.ID
WHERE
o.level LIKE '%ex%'
AND
c.status LIKE '%paid%'
GROUP BY payee )
GROUP BY payee
如何通過單個查詢獲得預期結果。
我想從下表中運行一個查詢,得到從執行辦公室支付的金額與應付總金額的比率。
我想你只想要 window 功能:
SELECT c.payee, SUM(c.amount) as totalsdue,
SUM(c.amount) / SUM(SUM(c.amount)) OVER () as ratio
FROM cheques c
GROUP BY payee;
您的查詢中有其他條件,但問題中沒有解釋。
對於結果,您可以在 JOIN 中使用子查詢
SELECT t1.payee, t1.totalsdue, t1.totalsdue/t2.totalpaid
from (
SELECT c.payee, SUM(c.amount) as totalsdue
FROM cheques c
GROUP BY payee
) t1
INNER JOIN (
SELECT c.payee, SUM(c.amount) as totalpaid, c.status
FROM cheques c
JOIN offices o ON c.officeID = o.ID
WHERE o.level LIKE '%ex%'
AND c.status LIKE '%paid%'
GROUP BY payee
) t2 on t1.payee = t2.payee
為了更好的表現..
檢查你是否真的需要 like 和 wildchar 匹配,或者你可以得到完全匹配的查詢
並確保您對可能參與連接的列有正確的索引以及在哪里
表檢查列(officeID、payee)
或者如果列狀態允許完全匹配列(officeID、status、payee)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.