2012-05-11 6 views
0

私は、時間単位のエントリをデータベースに照会して、会社ごとと週ごとに集計しています。 MySQLの週機能はカレンダーの週に基づいていることを理解しています。それは、私はいくつかの予期しないグループ化の結果を得ていると言われています。おそらく、あなたの鋭い目人々が手を貸すことができます。以下のようにMySQLの週機能予期しない結果

SELECT * FROM (
    SELECT 
     tms.date, 
     SUM(IF(tms.skf_group = "HP Group", tms.hours, 0000.00)) as HPHours, 
     SUM(IF(tms.skf_group = "SKF Canada", tms.hours, 000.00)) as SKFHours 
    FROM time_management_system tms 
    WHERE date >= "2012-01-01" 
    AND date <= "2012-05-11" 
    AND tms.skf_group IN ("HP Group", "SKF Canada") 
    GROUP BY WEEK(tms.date, 7) 
    # ORDER BY tms.date DESC 
    # LIMIT 7 
) AS T1 
ORDER BY date ASC 

は私の結果は以下のとおりです(時折私たちは例えば日曜日にエントリを持っていないnull値は重要でください。?)

('date'=>'2012-01-01','HPHours'=>'0.00','SKFHours'=>'2.50'), 
('date'=>'2012-01-02','HPHours'=>'97.00','SKFHours'=>'78.75'), 
('date'=>'2012-01-09','HPHours'=>'86.50','SKFHours'=>'100.00'), 
('date'=>'2012-01-16','HPHours'=>'68.00','SKFHours'=>'96.25'), 
('date'=>'2012-01-24','HPHours'=>'39.00','SKFHours'=>'99.50'), 
('date'=>'2012-02-05','HPHours'=>'3.00','SKFHours'=>'93.00'), 
('date'=>'2012-02-06','HPHours'=>'12.00','SKFHours'=>'122.50'), 
('date'=>'2012-02-13','HPHours'=>'64.75','SKFHours'=>'117.50'), 
('date'=>'2012-02-21','HPHours'=>'64.50','SKFHours'=>'93.00'), 
('date'=>'2012-03-02','HPHours'=>'45.50','SKFHours'=>'143.25'), 
('date'=>'2012-03-05','HPHours'=>'62.00','SKFHours'=>'136.75'), 
('date'=>'2012-03-12','HPHours'=>'54.25','SKFHours'=>'133.00'), 
('date'=>'2012-03-19','HPHours'=>'77.75','SKFHours'=>'130.75'), 
('date'=>'2012-03-26','HPHours'=>'61.00','SKFHours'=>'147.00'), 
('date'=>'2012-04-02','HPHours'=>'86.75','SKFHours'=>'96.75'), 
('date'=>'2012-04-09','HPHours'=>'84.25','SKFHours'=>'120.50'), 
('date'=>'2012-04-16','HPHours'=>'90.00','SKFHours'=>'127.25'), 
('date'=>'2012-04-23','HPHours'=>'103.25','SKFHours'=>'89.50'), 
('date'=>'2012-05-02','HPHours'=>'72.50','SKFHours'=>'143.75'), 
('date'=>'2012-05-07','HPHours'=>'68.25','SKFHours'=>'119.00') 

1月2日は最初の月曜日なので、1月1日は唯一の日です。私は出力が月曜日(1月2日月曜日、9月、16日、23日、30日など)に連続することを期待していますか?以下の予期しない週のグループ分けは、結果全体を通じて続きます。何か案は?

ありがとうございました!

答えて

3

それはあなたがtms.date上のいくつかの機能によってグループ化しているときを意味するものでもtms.dateを選択する明確ではありません。私の推測では、「このグループに対応するソース行の値はdate」という意味です。その時点で、出力は完全に合理的です。

与えられたグループの中に7つの日付があるとすれば、の結果はになりますか?

EDIT:この動作は実際に"GROUP BY and HAVING with Hidden Columns"で文書化されています

選択リストは、GROUP BY句で指定されていない非集約列を参照できるように、MySQLはGROUP BYの使用を拡張します。
...
サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択した値は不定です。さらに、各グループからの値の選択は、ORDER BY句を追加することによって影響を受けることはありません。結果セットのソートは、値が選択された後に行われ、ORDER BYはサーバーが選択する値に影響しません。

tms.dateは、GROUP BY句の一部ではありません - tms.dateは、GROUP BY句の一部である上で動作のみ機能、私はテキストは以上のように適用されると信じています」 tms.dateを選択してください:は、その週の任意の日付になります。

あなたは早い日付をしたい場合は、当然の日付/時刻フィールドでそのMIN作品を、想定しています

SELECT MIN(tms.date), ... 

を試してみてください。私はその文書から簡単には分かりません。

+0

AAAND ...のように平日でグループ化したいと思います!大変感謝しています。 – Andrew

0

質問は私にとっては明らかではありませんが、あなたは週別にグループ化したくないと思います。週は1年の週を与えるからです。今日は19週目です。

私はあなたがトリックをしたGROUP BY平日あなたが438kポイントを持っている理由である(tms.date)