2011-07-07 21 views
0

我需要一个将有日期,用户名和该日期的十二个operation_id之一的查询。例如如何将日期交叉加入选区?

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 

但我也想渡过每一天加入在2011年1月1日到现在,以便我可以使用此查询为每个人每天的每项操作提供记录,以便我可以将其放在数据透视表中,然后用它来驱动每周的报告为每个用户进行每项操作。

截至目前我有一个简单的选择用户ID从db.users加入操作,其中DepartmentID的= 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月1日至今的所有日期。这甚至有可能吗?

+2

你尝试过什么吗?另外问题通常在他们的某个地方有问号。 – JNK

+0

问题在标题中。此外,编辑,以反映我已经尝试过。 – davidahines

+1

标题中问题的答案是“是”。 :) – JNK

回答

1

您可以创建一个日期表像这样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); 

这将使用从2011-01-01开始的30天填充表格。

我没有添加插入语句中的所有列。应该是相当直接添加,尽管使用从here信息。

+0

嗯。这是在TSQL中,我不确定差异。我删除了@符号,并试图更改变量名称,但没有去。 – davidahines

+1

应该已经更清楚了,我只是想告诉你日期表的想法。该脚本展示了如何生成日期,这可以通过多种方式完成。我想我在创建数据时使用了java。 – xecaps12

+0

啊。我想我会尝试一下,然后看看它是否能够实现。 – davidahines

1

最简单的方法是在一年中有一个预定义的表,包括所有日期,最多365行。然后,您可以在查询中简单地使用该表,只选择2011-01-01和NOW()之间的行。这也意味着你的查询将不得不通过在每次运行中创建一个日期表来进行较少的工作。

只是另一个想法,虽然我不知道你是否需要这个。如果意图是每年都有一个日期表,例如2012年,您需要一个类似的日期表,但所有日期从2012年开始,那么您可以考虑只存储没有年份的日期和月份。

希望这是有道理的。

+0

http://stackoverflow.com/questions/6613986/how-do-i-convert-this-from-tsql-to-mysql/6614403#6614403 – davidahines

+0

我完全同意,我试图在该问题中填充表格但我很难过。我正在使用本教程,但它在T-SQL中,因此造成困难:http://www.techrepublic.com/blog/datacenter/simplify-sql-server-2005-queries-with-a-dates-table/326 – davidahines