1

毎月の作業時間のマトリックスを表示する単一のクエリを作成しようとしています。私はこれを達成しようとしています。

ここに画像の説明を入力

私は現在これを持っています。 ここに画像の説明を入力

正しい出力は ここに画像の説明を入力

私のSQLは

`週 ID として週 (開始) を選択し、
                (
                    SELECT SUM(TIME_TO_SEC(TIMEDIFF(停止、開始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(開始)=0
                ) AS月曜日、
                (
                    SELECT SUM(TIME_TO_SEC(TIMEDIFF(停止、開始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(開始)=1
                ) AS火曜日、
                (
                    SELECT SUM(TIME_TO_SEC(TIMEDIFF(停止、開始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(開始)=2
                ) AS水曜日、
                (
                    SELECT SUM(TIME_TO_SEC(TIMEDIFF(停止、開始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(開始)=3
                ) AS木曜日、
                (
                    SELECT SUM(TIME_TO_SEC(TIMEDIFF(停止、開始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(開始)=4
                ) AS 金曜日、
                (
                    SELECT SUM(TIME_TO_SEC(TIMEDIFF(停止、開始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(開始)=5
                ) AS土曜日、
                (
                    SELECT SUM(TIME_TO_SEC(TIMEDIFF(停止、開始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(開始)=6
                ) AS 日曜日
            FROM tbl_time_clock
            WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
            GROUP BY WEEK(開始)`

テーブルは次のようになります

╔═════════╦═════════════════════╦═════════════════ ════╗
║ user_id ║ 開始 ║ 停止 ║
╠═════════╬═════════════════════╬═════════════════ ════╣
║ 1 ║ 2012-08-28 08:14:49 ║ 2012-08-28 10:14:49 ║
║ 1 ║ 2012-08-25 10:00:32 ║ 2012-08-25 16:21:57 ║
╚═════════╩═════════════════════╩═════════════════ ════╝

ありがとう!!!

4

2 に答える 2

2

これにはサブクエリは必要ありません。

2 つのフィールドでグループ化して、プログラミング言語にプレゼンテーションを行わせる (テーブルを作成する) のが一般的です。

SELECT 
    WEEK(start) as weekId,
    WEEKDAY(start) as weekDay,
    TIME_TO_SEC(TIMEDIFF(stop, start))
FROM tbl_time_clock
WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
GROUP BY WEEK(start), WEEKDAY(start)

SQL 自体が実際に行列を提供する必要がある場合 (しかし、なぜでしょうか?)、これを試してください。

SELECT 
    WEEK(start) as weekId,
    SUM( if( WEEKDAY(start)=0,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Monday,
    SUM( if( WEEKDAY(start)=1,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Tuesday,
    SUM( if( WEEKDAY(start)=2,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Wednesday,
    SUM( if( WEEKDAY(start)=3,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Thursday,
    SUM( if( WEEKDAY(start)=4,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Friday,
    SUM( if( WEEKDAY(start)=5,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Saturday,
    SUM( if( WEEKDAY(start)=6,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Sunday,
FROM tbl_time_clock
WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
GROUP BY WEEK(start)
于 2012-09-02T15:33:42.927 に答える
0

各サブクエリで週を制約する必要があるようです。これを行うには、内側のテーブルにエイリアスを追加して、外側のクエリの値を内側のクエリで参照できるようにします。月曜日のサブクエリは次のようになります。

(
     SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start)))
     FROM tbl_time_clock AS tbl_inner
     WHERE WEEKDAY(tbl_inner.start)=0
     AND WEEK(tbl_inner.start)=tbl_outer.week_start
) AS Monday

制約付きサブクエリを実行する前に、外側のテーブルをグループ化する必要があります。そうしないと、1 週間に複数の結果が得られます。したがって、外側の FROM 句は次のようになります。

FROM (
    select WEEK(start) AS week_start FROM tbl_time_clock GROUP BY WEEK(start)
    WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
) as tbl_outer

編集:修正。また、おそらくマトリックスは不要であり、彼の SQL ソリューションの方が優れているという点で Konerak に同意します。指定された SQL を変更してソリューションを取得する方法を示しているため、これはそのままにしておきます。

于 2012-09-02T15:18:02.607 に答える