2013-09-26 3 views
2

Предположим, что я хочу, чтобы получить идентификатор, цену и SUM (цены), поэтому она должна выглядеть следующим образом:Получить сумму для уникальных полей

ID price sum 
-------------------- 
1  10  
1  10  20 
2  20  
2  20  40 
3  30 
3  30  60 

Каков путь для достижения этой цели? Мой реальный вопрос:

SELECT users.login, projects.name, time_entries.issue_id, time_entries.hours 
FROM users, time_entries 
INNER JOIN projects ON time_entries.project_id = projects.id 
WHERE time_entries.spent_on = CURDATE() - 1 
AND time_entries.user_id = users.id 
ORDER BY users.login; 

показывает

+-------+----------------------------------------------------+----------+-------+ 
| login | name            | issue_id | hours | 
+-------+----------------------------------------------------+----------+-------+ 
| ach | name1            | 12624 |  8 | 
| aco | name2            | 11550 |  3 | 
| aco | name2            | 11585 |  3 | 
| alt | name3            | 12644 | 7.5 | 
| ata | name4            | 12761 |  1 | 
| ata | name5            |  NULL |  1 | 
| ata | name6            | 12790 | 0.5 | 
| ata | name7            | 12677 | 5.5 | 
| ato | name8            | 12530 |  8 | 
| elb | name8            | 12697 |  1 | 
| elb | Software management        | 12678 |  7 | 

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

+3

данные вы показываете не соответствует требуемым данным (т. е. нет столбца «цена»). Кроме того, нужен ли вам вывод строк, содержащих пустые суммы? Или, было, «что это должно выглядеть» вообще и не направлено на ваши точные данные? – newfurniturey

ответ

0

Я считаю, что вы ищете здесь GROUP BY:

SELECT 
    users.login, SUM(time_entries.hours) AS hours 
FROM 
    users 
    JOIN time_entries ON time_entries.user_id = users.id 
WHERE 
    time_entries.spent_on = CURDATE() - 1 
GROUP BY 
    users.login 

Это даст результат, похожий на:

login hours 
-------------- 
ach  42 
alt  13 
ata  27 

Если вы хотите включить issue_id колонку, согласно вашему образцу вывод может отличаться, вы можете быть заинтересованы в GROUP_CONCAT(), который будет вытаскивать список, разделенный запятыми по каждой проблеме, которую данный пользователь имел:

SELECT 
    users.login, 
    GROUP_CONCAT(issue_id) AS issues, 
    SUM(time_entries.hours) AS hours 
... 
0
SELECT users.login, projects.name, time_entries.issue_id, SUM(time_entries.hours) as hours 
FROM users, time_entries 
INNER JOIN projects ON time_entries.project_id = projects.id 
WHERE time_entries.spent_on = CURDATE() - 1 
AND time_entries.user_id = users.id GROUP BY users.login 
ORDER BY users.login; 
0

newfurniturey, спасибо за ваш ответ и спасибо другим. Это ближайший я ищу:

SELECT users.login, GROUP_CONCAT(projects.name), 
GROUP_CONCAT(time_entries.issue_id), 
GROUP_CONCAT(time_entries.hours), SUM(time_entries.hours) as hours 
FROM users, time_entries 
INNER JOIN projects ON time_entries.project_id = projects.id 
WHERE time_entries.spent_on = CURDATE() - 1 
AND time_entries.user_id = users.id 
GROUP BY users.login ORDER BY users.login; 

    | ata | name1,name2,name3 | 12761,12790,12677 | 1,1,0.5,5.5 | 8 | 

Но я хотел бы получить следующий результат, если это возможно:

| ata | name1 | 12761 | 1 | | 
| ata | name2 | 12790 | 1 | | 
| ata | name3 | 12677 | 0.5 | | 
| ata | name3 | 12677 | 5.5 | 8 | 

или

| ata | name1 | 12761 | 1 | 
| ata | name2 | 12790 | 1 | 
| ata | name3 | 12677 | 0.5 | 
| ata | name3 | 12677 | 5.5 | 
| ata |  |  |  | 8 | 
Смежные вопросы