Как я могу присоединиться к дате выбора? - PullRequest
0 голосов
/ 07 июля 2011

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

operations
"id";"name";
"1";"LASER CUTTING"
"2";"DEBURR"
"3";"MACHINING"
"4";"BENDING"
"5";"PEM"
"6";"WELDING"
"7";"PAINT PREPARATION"
"8";"PAINTING"
"9";"SILKSCREEN PREPARATION"
"10";"SILKSCREEN"
"11";"ASSEMBLY - PACKAGING"
"12";"LASER PREP";

и таблица пользователей

bob
jimmeh
jimbo

У меня есть перекрестное соединение между этими таблицами, чтобы получить что-то вроде этого:

bob 1
bob 2
bob 3
bob 4
bob 5
bob 6
bob 7
bob 8
bob 9
bob 10
bob 11
bob 12
jimmeh 1
jimmeh 2
jimmeh 3
jimmeh 4
jimmeh 5
jimmeh 6
jimmeh 7
jimmeh 8
jimmeh 9
jimmeh 10
jimmeh 11
jimmeh 12
jimbo 1
jimbo 2
jimbo 3
jimbo 4
jimbo 5
jimbo 6
jimbo 7
jimbo 8
jimbo 9
jimbo 10
jimbo 11
jimbo 12

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

На данный момент у меня есть простой select userid из операций присоединения db.users, где detamentid = 8

Я пробовал это:

select 
  userid, 
    first_name, 
    last_name,
    operations.id,
    operations.name
from 
  protocase.tblusers 
join
  operations
join
  select (BETWEEN "2011-01-01" and NOW())
where 
  departmentid = 8 and 
    protocase.tblusers.active = 1

Аналогично тому, как можно выбрать (1,2,3) или что-то еще, чего нет в таблице, но я не могу понять, как я выбрал бы все даты между 1 января и сейчас.Это вообще возможно?

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Самый простой способ - это иметь предварительно определенную таблицу со всеми датами в году, которая будет не более 365 строк. Затем вы можете просто использовать эту таблицу в своем запросе, выбирая только строки между 2011-01-01 и NOW (). Это также будет означать, что вашему запросу придется выполнять меньшую работу, не создавая таблицу дат при каждом запуске.

Просто еще одна мысль, хотя я не уверен, понадобится ли вам это. Если вы хотите создать таблицу дат для каждого года, например, в 2012 году вам нужна аналогичная таблица дат, но со всеми датами 2012 года, то вы можете рассмотреть вопрос о сохранении только даты и месяца без года.

Надеюсь, это имеет смысл.

1 голос
/ 07 июля 2011

Вы можете создать такую ​​таблицу дат, как эта http://www.techrepublic.com/blog/datacenter/simplify-sql-server-2005-queries-with-a-dates-table/326

Редактировать: добавлена ​​хранимая процедура для генерации дат:

DROP PROCEDURE IF EXISTS datePopulate;
DELIMITER $$
CREATE PROCEDURE datePopulate( startDate datetime, numDays int)
BEGIN

declare currDate datetime default startDate;
declare i int default 1;

WHILE (i<=numDays) DO       

    INSERT INTO DateLookup(DateFull, fullYear, weekdayname) 
    VALUES(currDate, date_format(currDate, '%Y'), date_format(currDate, '%a'));
    SET i = i+1;
    SET currDate = DATE_ADD(currDate , INTERVAL 1 DAY);

END WHILE;

END $$
DELIMITER ;

После создания процедуры онаможно назвать так:

CALL datePopulate('2011-01-01', 30);

Это заполнит таблицу 30 днями, начиная с 2011-01-01.

Я не добавил все столбцы в операторе вставки.Должно быть довольно просто добавить, используя информацию из здесь .

...