Несколько агрегатных функций в MySQL с различными условиями - PullRequest
1 голос
/ 12 декабря 2010

Я выполняю следующий запрос

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 и возвращались как часть того же набора записей.Какие-либо предложения?

Ответы [ 2 ]

3 голосов
/ 12 декабря 2010

В вашем текущем коде просто отсутствует связь между внешним запросом и подзапросами.Теоретически, вам просто нужно соотнести запросы:

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 голосов
/ 12 декабря 2010

сумма, если, и считать, если делать трюк

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
...