таблица id | employeeid | workdate | hourscount в таблицу пишется ид работника, дата и кол-во отработанных часов. нужно для каждого работника посчитать сумму отработанных часов за определенный промежуток времени. пока додумался только до этого Код (PHP): select Distinct employeeid, name, (select sum(hourscount) from timesheet where workdate between '2016-02-01' and '2016-02-15') as firstsum, (select sum(hourscount) from timesheet where workdate between '2016-02-16' and '2016-02-29') as secondsum from timesheet join employees on timesheet.employeeid = employees.id считает естественно не правильно. Добавлено спустя 30 минут 41 секунду: правильно вроде считает Код (PHP): select Distinct employeeid, name, (select sum(hourscount) from timesheet where workdate between date('2016-02-01') and date('2016-02-15') and timesheet.employeeid = employees.id) as firstsum, (select sum(hourscount) from timesheet where workdate between date('2016-02-16') and date('2016-02-29') and timesheet.employeeid = employees.id) as secondsum from timesheet join employees on timesheet.employeeid = employees.id
для каждого работника: GROUP BY employeeid посчитать сумму отработанных часов: SUM(hourscount) за определенный промежуток времени: WHERE workdate BETWEEN '2016-02-01' AND '2016-02-15' Клеим всё вместе по правилам: Код (PHP): SELECT `employeeid`, SUM(`hourscount`) AS `total` FROM `timesheet` WHERE `workdate` BETWEEN '2016-02-01' AND '2016-02-15' GROUP BY `employeeid` Добавлено спустя 3 минуты 9 секунд: Если хочется добавить что-то из таблицы "работники", можно этот запрос использовать в качестве под-запроса: Код (PHP): SELECT e.`name`, s.* FROM `employees` AS e LEFT JOIN ( SELECT `employeeid`, SUM(`hourscount`) AS `total` FROM `timesheet` WHERE `workdate` BETWEEN '2016-02-01' AND '2016-02-15' GROUP BY `employeeid` ) AS s ON e.`id` = s.`employeeid` Добавлено спустя 1 минуту 31 секунду: LEFT JOIN даёт нам возможность вывести всех работников, даже если в указанный период у кого-то из них нет отработанных часов. Будут просто пустые места вместо цифр. Добавлено спустя 4 минуты 46 секунд: Если нужны два рабочих периода, то сделай по образцу два LEFT JOINа с подзапросами. [оффтопик] DISTINCT обычно служит признаком неуверенности автора ))) если не понимаешь, что происходит, не используй его. лучше не прятать от себя логические ошибки. [/оффтопик]
Вот нагуглил для тебя: http://www.sql-tutorial.ru/ru/book_explicit_join_operations.html только MySQL имеет свои ограничения по сравнению со стандартом. ты главное суть улови, нюансы со временем узнаешь.
спс, только вчера это смотрел, тут проблема не в том что я гуглить не умею, а в том что вот не понимаю я его нихрена и все тут)) вот как это работает Код (PHP): select employeeid, name, (select sum(hourscount) from timesheet where workdate between date('2016-02-01') and date('2016-02-15') and timesheet.employeeid = employees.id) as firstsum, (select sum(hourscount) from timesheet where workdate between date('2016-02-16') and date('2016-02-29') and timesheet.employeeid = employees.id) as secondsum from timesheet join employees on timesheet.employeeid = employees.id group by employees.id я понимаю, а куда в твоем примере второй left join вставить, нет
Ты видишь как я оформил запрос регистром, обратными кавычками и отступами? Согласись так намного лучше читается. В твой запрос мне смотреть страшно. А дополнительные джойны пишутся очень просто: последовательно друг за другом: … FROM a JOIN b ON b.x=a.x JOIN c ON c.z=a.z … и т.д. Добавлено спустя 2 минуты 45 секунд: Вместо любой таблицы ты можешь вставить подзапрос в круглых скобочках и дать ему "имя". (…) AS b
Просто замени LEFT JOIN на JOIN и получишь желаемое. Т.е. нет в таймшит в выбранный период. Если задаться целью показать статистику за период, но при этом засветить всех, кто хоть раз попадался в таймшит, то запрос будет другой.
Код (PHP): SELECT e.name, s.*, s1.* FROM `employees` AS e JOIN( SELECT `employeeid` as id, SUM(`hourscount`) AS `total` FROM `timesheet` WHERE `workdate` BETWEEN '2016-02-01' AND '2016-02-15' GROUP BY `employeeid` ) as s ON e.`id` = s.`id` JOIN( SELECT `employeeid` as id1, SUM(`hourscount`) AS `total1` FROM `timesheet` WHERE `workdate` BETWEEN '2016-02-16' AND '2016-02-30' GROUP BY `employeeid` ) as s1 ON e.`id` = s1.`id1` так? одного пользователя выводит и считает не правильно
Выглядит правдоподобно. Думаю если и есть что-то неправильное, то это данные в таблице. Проверь их. Чего-нибудь задублировал или в дате ошибся.
получается что он правильно работает, показывает пользователей у которых total и total1 не = null, а нужно тех у которых total или total1 не = null
Херня какая-то, а не запрос. Нафига их два-то да ещё и с джоинами. Бред какой-то. Хочешь сумму за период - просто возьми ее.