2010-12-12 23 views
1

私は合計、num_incompleteおよびグループ化が素晴らしい作品MySQLで複数の集計関数

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 

次のクエリを実行しています。サブ選択値は各行で同じです。これらの値をlender_nameでグループ化し、同じレコードセットの一部として返すことをお勧めします。助言がありますか?

+0

T1の別名がこれは動作するはずですあなたの例 – newtover

答えて

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

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