簡體   English   中英

在沒有子查詢的 mysql 中獲取比率

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM