2017-02-17 10 views
-1

У меня есть таблица, в которой хранятся данные о труде. Один из столбцов - количество отработанных часов (rthours) по конкретному проекту, другой столбец - дата (labor_date).Групповая сумма за день недели и сдача в аренду

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

График начинается в понедельник и заканчивается в воскресенье.

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

Любые предложения?

Вот код:

$sql = "SELECT SUM(rthours) as total FROM data WHERE (WEEK(labor_date) = WEEK(NOW())) AND (user_name = '$user') GROUP BY DAY(labor_date) ORDER BY DAY(labor_date)"; 

$result = mysqli_query($conn, $sql); 
$thours = array(); 

while ($row = mysqli_fetch_assoc($result)) { 
      $thours[] = $row["total"]; 
     } 
mysqli_close($conn); 

?> 
+0

Внутри цикла while добавьте что-то вроде j = 0, затем перейдите на 1 и используйте $ thours [j] = $ row ['total']; – user3741598

+0

Почему у вас 2 ответа от вас ниже? который правильный? –

ответ

0

Фигурные его. С помощью этого оператора выбора работы:

SELECT SUM(rthours) total 
    FROM data 
WHERE (WEEK(labor_date) = WEEK(NOW())) 
    AND (YEAR(labor_date) = YEAR(NOW())) 
    AND (user_name = '$user') 
GROUP 
    BY WEEKDAY(labor_date) 
ORDER 
    BY WEEKDAY(labor_date); 
+0

... но он не решает вторую часть вашего вопроса: заполнять пробелы. См. Мой ответ. – trincot

+0

Откуда вы знаете, какая именно? – Strawberry

1

Прежде всего, ваш код открыт для SQL injection. Я не буду говорить об этом здесь, но, пожалуйста, исправьте это.

Вам необходимо использовать функцию weekday (1 - 7), а не day (1 - 31), так как последняя может пересекать границу месяца и затем производить неправильный порядок.

Чтобы заполнить пробелы, вы можете добавить в свой запрос виртуальную таблицу, в которой будут отображаться числа от 1 до 7, а затем внешние соединения с вашими данными. В случае отсутствия дней ваша сумма будет по-прежнему включена, но null. С coalesce вы можете превратить это значение 0:

SELECT COALESCE(SUM(rthours), 0) as total 
FROM  (SELECT 1 as weekday 
      UNION ALL SELECT 2 UNION ALL SELECT 3 
      UNION ALL SELECT 4 UNION ALL SELECT 5 
      UNION ALL SELECT 6 UNION ALL SELECT 7) as ref 
LEFT JOIN data 
     ON DAYOFWEEK(labor_date) = ref.weekday 
WHERE  WEEK(labor_date) = WEEK(NOW()) 
AND  user_name = ? 
GROUP BY ref.weekday 
ORDER BY ref.weekday 
+0

Здравствуйте, благодарю вас за помощь. Это не работает. Диаграмма заполняется цифрой 8, где отсутствуют данные, отсутствующие в течение недели. У одного сотрудника есть 8 часов, записанных в понедельник, но пока данных нет на оставшуюся часть недели, но график показывает 8 часов с понедельника по пятницу, –

0

Отредактированный код к этому:

"SELECT COALESCE(SUM(rthours) + SUM(othours) + SUM(trthours) + SUM(tothours), 0) as total 
FROM (SELECT 1 as weekday 
      UNION ALL SELECT 2 UNION ALL SELECT 3 
      UNION ALL SELECT 4 UNION ALL SELECT 5 
      UNION ALL SELECT 6 UNION ALL SELECT 7) as ref 
LEFT JOIN data 
     ON DAYOFWEEK(labor_date) = ref.weekday 
WHERE  WEEK(labor_date) = WEEK(NOW()) AND Year(labor_date) = Year(NOW()) 
AND  user_name = '$user' 
GROUP BY ref.weekday 
ORDER BY ref.weekday"; 

код захватывает данные, но до сих пор не размещая нули, когда данные не существует в течение определенного дня ,