Ошибка в запросе Mysql для создания гистограммы, вероятно, в определении параметра
Я чувствую себя немного раздраженным, когда спрашиваю об этом, но будет ли кто-то так любезен, чтобы устранить недостаток в этом коде? Мой MySQL-сервер не понимает этот запрос.
Это часть большого php-mysql-javascript, где пользователь определяет, насколько большим должен быть один гистограммбар. В этом случае бар 5 дней. Числа между " " вычисляются переменными $ php-скриптом до того, как запрос будет представлен движку базы данных.
brontabel - это таблица, состоящая из двух столбцов gendate и datum1. Gendate - это время, когда таблица генерируется другими запросами. Tijd обозначает дату покупки товара. Мне было бы далеко объяснить, почему, но в бронтабеле есть более одного жандата.
Мне важно сказать, что я не ИТ-специалист. Я делаю этот сценарий, чтобы объяснить IT-сервису моей компании, что мне нужно. Таким образом, они могут переписать / улучшить программу на более элегантном языке, таком как R или что-то в этом роде. (Чтобы разработать то, что я хочу с нуля, им нужно много статистических знаний о негауссовых дистрибутивах)
Поэтому, пожалуйста, дайте решение, которое я могу понять! Некоторые из вопросов в вопросе "MySQL: получение данных для гистограммы?" дай мне мозговое срыв:-)
SELECT
gendate,
tijd,
SUM(CASE
WHEN (gendate - datum1) >= (tijd - " 5 " )
AND (gendate - datum1) < tijd
THEN 1 ELSE 0 END) AS aantal,
SUM(CASE
WHEN (gendate - datum1) >= tijd
THEN 1 ELSE 0 END) AS rest,
(SUM(CASE
WHEN (gendate - datum1) >= tijd
THEN 1 ELSE 0 END) * 100/count(*)) AS percentage_erna_actief
FROM brontabel,
(VALUES " 5 ", " 10 ", " 15 ", " 20 ", " 25 ", " 30 ",
" 35 " , " 40 ", " 45 ", " 50 ", " 55 ", " 60 ", " 65 ",
" 70 ", " 75 ", " 80 ") AS X(tijd)
WHERE gendate = MAX(gendate)
GROUP BY tijd
PS Извините за растерянность Хорхе
Ват я хочу, чтобы сгенерировать гистограмму (гистограмму) всех предметов, которые куплены, но еще не отправлены. Элемент будет оставаться в таблице до тех пор, пока он не будет отправлен, чем строка удалена из таблицы брони другими запросами.
Если вы купили товар 19-11-2013 (datum1) и таблица была сгенерирована сегодня 30-11-2013, чем gendate-datum1 = 11 (товар / покупка уже ждет одиннадцать дней для отправки), поэтому планка (представленная временем =15)) будет увеличиваться с одним.
Вы получаете что-то вроде этого
gendate
время (Tijd)
активный (сколько покупок, принадлежащих этому бару, ожидает отправки) остальное (сколько покупок ожидает уже дольше, чем время (tijd) для отправки) процент_erna_actief (остаток выражается в процентах)
общее количество товаров / покупок, ожидающих отправки = 200 (200 строк в таблице)
gendate time active rest percentageernaactief
30-11 5 2 198 99% (2 purchases are less than 5 days waiting for shipping)
30-11 10 6 192 96% (6 purchases are between 5 and 10 days waiting for shipping)
30-11 15 12 180 90%
30-11 20 20 160 80%
30-11 25 0 160 80%
30-11 30 0 160 80%
30-11 35 40 120 60%
...
Надеюсь, что это делает это более ясным
1 ответ
Чтобы MySql понять, что вы хотите, нужно будет использовать это:
SELECT
gendate,
tijd,
SUM(CASE
WHEN (gendate - datum1) >= (tijd - 5 )
AND (gendate - datum1) < tijd
THEN 1 ELSE 0 END) AS aantal,
SUM(CASE
WHEN (gendate - datum1) >= tijd
THEN 1 ELSE 0 END) AS rest,
(SUM(CASE
WHEN (gendate - datum1) >= tijd
THEN 1 ELSE 0 END) * 100/count(*)) AS percentage_erna_actief
FROM brontabel,
(select 5 tijd union select 10 union select 15 union
select 20 union select 25 union select 30 union
select 35 union select 40 union select 45 union
select 50 union select 55 union select 60 union
select 65 union select 70 union select 75 union
select 80) AS X
WHERE gendate = ( select MAX(gendate) from brontabel )
GROUP BY gendate, tijd
В таблице X есть нужные вам значения
И where
часть получает максимальное значение от gendate
Также необходимо сгруппировать по столбцам, которые не агрегированы.
Также имейте в виду, что вы делаете картезианский план, что означает, что для каждого реестра в brontabel
Таблица будет умножена на количество значений на X
Таблица