2015-08-12 5 views
0

Учитывая таблицу в схеме MySQL с форматом, похожим на: person_id | CREATION_DATE Пример данных:MySQL: использование агрегатных функций в значениях столбцов

p1 | 08-12-1995 
p2 | 04-11-2002 
p3 | 12-31-2007 
... 

Я с трудом понимая синтаксис сделать следующие функциональные возможности: 1. Я хочу, чтобы подсчитать количество людей, основываясь на их дате создания Например, я хочу, чтобы создать таблицу, которая GROUPED за год и будет содержать колонку поддержки, в которой есть COUNT всех людей, которые были созданы в течение этого года. 2. Используйте агрегатную функцию, которая будет в состоянии вычислить дельту между значениями за два года на основе нового, сгруппированных по таблице т.е.

Year | # of people | Delta 
1995 | 20   | 
1996 | 22   | +10% 
1997 | 18   | -18% 
... 

Я новичок в MySQL и синтаксис еще меня смущает. Я не знаю, является ли создание новой таблицы GROUP'd основанной на году наиболее эффективным решением для решения проблемы, и я не уверен, как бы вычислить дельта в таблице в мою.

+0

Создание отдельной таблицы может переусердствовать, но в зависимости от сложности вычислений может потребоваться. – Uueerdo

ответ

1

Нечто подобное должно работать, но старайтесь не изменять порядок столбцов результата (они, неофициально, оцениваются слева направо).

SET @lastCount := null; 
SELECT creationYear AS `Year` 
, IF(@lastCount IS NULL 
    , '' 
    , CONCAT(ROUND(100*((pCount/@lastCount)-1), 0), '%') 
) AS `Delta` 
, @lastCount := pCount AS `# of people` 
FROM (
    SELECT YEAR(creation_date) AS creationYear, COUNT(1) AS pCount 
    FROM theTable 
    GROUP BY creationYear 
    ORDER BY creationYear 
) AS subQ 
+0

хорошая работа Uueerdo – Drew

0

Вы также можете сделать что-то вроде следующего, но на больших наборах данных ответ на что-то вроде Uueerdo должен быть быстрее.

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(year INT NOT NULL 
, person VARCHAR(12) NOT NULL 
, PRIMARY KEY(year,person) 
); 

INSERT INTO my_table VALUES 
(1995,'Adam'), 
(1995,'Ben'), 
(1995,'Charlie'), 
(1995,'Dan'), 
(1996,'Edward'), 
(1996,'Fred'), 
(1996,'Gary'), 
(1996,'Henry'), 
(1997,'Inigo'), 
(1997,'James'), 
(1997,'Kevin'), 
(1997,'Leonard'), 
(1998,'Michael'), 
(1998,'Noah'), 
(1998,'Oliver'), 
(1998,'Patrick'), 
(1998,'Quentin'), 
(1998,'Robert'), 
(1999,'Stephen'), 
(1999,'Thomas'), 
(1999,'Umberto'), 
(2000,'Victor'), 
(2000,'Walterr'), 
(2001,'Xavier'), 
(2002,'Yanick'), 
(2003,'Zac'); 

SELECT a.* 
     , a.n/b.n * 100 pct_diff 
    FROM 
     (SELECT x.year, COUNT(*) n FROM my_table x GROUP BY year) a 
    LEFT 
    JOIN 
     (SELECT x.year, COUNT(*) n FROM my_table x GROUP BY year) b 
    ON b.year = a.year - 1; 
+------+---+----------+ 
| year | n | pct_diff | 
+------+---+----------+ 
| 1995 | 4 |  NULL | 
| 1996 | 4 | 100.0000 | 
| 1997 | 4 | 100.0000 | 
| 1998 | 6 | 150.0000 | 
| 1999 | 3 | 50.0000 | 
| 2000 | 2 | 66.6667 | 
| 2001 | 1 | 50.0000 | 
| 2002 | 1 | 100.0000 | 
| 2003 | 1 | 100.0000 | 
+------+---+----------+ 
Смежные вопросы