2010-12-12 36 views
1

我運行下面的查詢多個集合函數在不同條件

SELECT t2.lender_name, COUNT(t1.id) as total,  
SUM(t1.submit_date IS NULL) AS num_incomplete, 

(SELECT AVG(DATEDIFF(due_date,now())) 
    FROM table_1 WHERE submit_date IS NULL) as avg_incomplete_due_in, 
(SELECT AVG(DATEDIFF(due_date,submit_date)) 
    FROM table_1 WHERE submit_date IS NOT NULL) as avg_complete_turnaround 

FROM table_1 
INNER JOIN table_2 t2 ON t2.fid = t1.id 
WHERE t1.due_date <= '2010-12-31' 
GROUP BY t2.lender_name 

總,num_incomplete和分組的偉大工程。每個行的子選擇值都相同。我希望那些由lender_name分組的值也作爲同一記錄集的一部分返回。有什麼建議麼?

+0

T1別名是不是在你的例子 – newtover 2010-12-12 12:37:30

回答

3

您當前的代碼只是缺少外部查詢和子查詢之間的關係的伎倆計數。理論上,你只需要關聯查詢:

SELECT t2.lender_name, COUNT(t1.id) as total, 
SUM(t1.submit_date IS NULL) AS num_incomplete, 
(SELECT AVG(DATEDIFF(due_date,now())) 
    FROM table_1 t3 
    WHERE submit_date IS NULL 
    AND t3.lender_name = t2.lender_name) as avg_incomplete_due_in, 
(SELECT AVG(DATEDIFF(due_date,submit_date)) 
    FROM table_1 
    WHERE submit_date IS NOT NULL 
    AND t3.lender_name = t2.lender_name) as avg_complete_turnaround 
FROM table_1 t1 
INNER JOIN table_2 t2 ON t2.fid = t1.id 
WHERE t1.due_date <= '2010-12-31' 
GROUP BY t2.lender_name 

實際上,查詢在MySQL中效率不高。您可以通過以下方式重寫一遍:

SELECT 
    t2.lender_name, 
    COUNT(*) as total, 
    SUM(t1.submit_date IS NULL) AS num_incomplete, 
    AVG(IF(t1.submit_date IS NULL, 
     DATEDIFF(t1.due_date, NOW()), 
     NULL)) AS avg_incomplete_due_in, 
    AVG(DATEDIFF(due_date,submit_date)) AS avg_complete_turnaround 
FROM table_1 t1 
INNER JOIN table_2 t2 ON t2.fid = t1.id 
WHERE t1.due_date <= '2010-12-31' 
GROUP BY t2.lender_name 
+0

我實現了你的建議改進,它工作了!非常感謝。 – pistolshrimp 2010-12-12 23:19:47

0

如果總和,如果做

SELECT t2.lender_name, COUNT(t1.id) as total,  
SUM(t1.submit_date IS NULL) AS num_incomplete, 
SUM(IF(table_1.submit_date IS NULL,DATEDIFF(table_1.due_date,now()),0))/COUNT(IF(table_1.submit_date IS NULL,1,NULL)) as avg_incomplete_due_in 
SUM(IF(table_1.submit_date IS NOT NULL,DATEDIFF(table_1.due_date,submit_date),0))/COUNT(IF(table_1.submit_date IS NOT NULL,1,NULL)) as avg_complete_turnaround 

FROM table_1 
INNER JOIN table_2 t2 ON t2.fid = t1.id 
WHERE t1.due_date <= '2010-12-31' 
GROUP BY t2.lender_name 
+0

定義這應該工作,但案件太多的字母。你剛纔實現了AVG功能=) – newtover 2010-12-12 12:29:19