2014-01-28 3 views
0

Учитывая следующие данные:MySQL - группы в результате повторяющихся строк

CREATE TABLE Bugs 
    (`ID` int, `BugDate` DATE, `resolved` int) 
; 

INSERT INTO Bugs 
    (`ID`, `BugDate`, `Resolved`) 
VALUES 
    (1, '2014-01-01', 1), 
    (2, '2014-01-01', 0), 
    (3, '2014-01-10', 1), 
    (4, '2014-01-10', 1), 
    (5, '2014-01-31', 0), 
    (6, '2014-01-31', 0) 
; 

Мне нужен выход, как следующее:

weeks old Resolved Unresolved total Rate 
--------- -------- ---------- ----- ---- 
    1  1   1  2  50% 
    2  2   0  2 100% 
    3  0   2  0 100% 

Я смотрю на список вопросов, и я хочу видеть общее число каждой недели и число, разрешенное каждую неделю. Я согласился с тем, что мне, вероятно, нужно будет вычислить столбцы total и rate в front-end, а MySQL - сделать это.

Я попытался следующий, но это не совсем туда попасть:

SELECT 
    WEEKOFYEAR(NOW())-WEEKOFYEAR(BugDate) as WeeksOld, 
    COUNT(Resolved) as NumberResolved, 
    (/* get the total number of issues for this time period */ 
    SELECT COUNT(Resolved) 
    FROM Bugs 
    WHERE WEEKOFYEAR(NOW())-WEEKOFYEAR(BugDate) = WeeksOld 
) - COUNT(Resolved) as Unresolved 
FROM Bugs 
GROUP BY WEEKOFYEAR(NOW())-WEEKOFYEAR(BugDate), Resolved 
ORDER BY WeeksOld DESC; 

Я так близко, но проблема в том, что я получаю двойные колонки в течение нескольких недель, где оба решены и нерешенные вопросы.

Что мне не хватает? Есть лучший способ сделать это?

Вот скрипку: http://sqlfiddle.com/#!2/eeb34/12

ответ

1

Вы просто хотите условную агрегацию:

SELECT WEEKOFYEAR(NOW())-WEEKOFYEAR(BugDate) as WeeksOld, 
     SUM(Resolved) as NumberResolved, 
     SUM(1 - Resolved) as Unresolved, 
     concat(format(AVG(Resolved)*100, 1), '%') as Rate 
FROM Bugs 
GROUP BY WEEKOFYEAR(NOW())-WEEKOFYEAR(BugDate) 
ORDER BY WeeksOld DESC; 

Обратите внимание, что это удаляет Resolved из group by. Он меняет расчет resolved на использование sum(), а не count(). Он добавляет столбец Rate. И он меняет расчет Unresolved. Вы можете написать последнее как:

count(*) - sum(Resolved) 
+0

То есть mysql kung fu гений. Спасибо. Нет «Total» Column, но я могу рассчитать это. – pbarney

1

Не группу по Исправленные - последние две строки должны быть

GROUP BY WEEKOFYEAR(NOW())-WEEKOFYEAR(BugDate) 
ORDER BY WeeksOld DESC; 
+0

Nice catch. Но другой ответ дал мне более очевидный путь или достижение моей цели. Спасибо. – pbarney

Смежные вопросы