0

日付、ユーザー名、およびその日付の12のoperation_idの1つを含むクエリが必要です。例えば

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日から現在まで毎日クロスジョインしたいと思います。これにより、このクエリを使用して、毎日のすべての操作のすべての人のレコードを取得し、ピボットテーブルに配置できるようになります。これを使用して、各操作の各ユーザーの各週のレポートを作成します。

今のところ、db.usersから簡単に選択したユーザーIDがあります。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日から現在までのすべての日付を選択する方法がわからないようです。これも可能ですか?

4

2 に答える 2

1

最も簡単な方法は、その年のすべての日付を含む事前定義されたテーブルを用意することです。これは最大365行になります。次に、そのテーブルをクエリで使用して、2011-01-01からNOW()までの行のみを選択できます。これは、実行のたびに日付テーブルを作成しないことで、クエリが実行する必要のある作業が少なくなることも意味します。

これが必要かどうかはわかりませんが、別の考えです。毎年の日付テーブルを作成することを目的としている場合、たとえば2012年には、同様の日付テーブルが必要ですが、すべての日付が2012年からのものである場合は、年を除いた日付と月のみを保存することを検討してください。

これが理にかなっていることを願っています。

于 2011-07-07T17:44:52.390 に答える
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日がテーブルに入力されます。

insertステートメントにすべての列を追加しませんでした。ここからの情報を使用して追加するのはかなり簡単なはずです。

于 2011-07-07T15:51:42.130 に答える