いくつかの結合を行った後、次のようなグループ化されていない結果/ビューを取得しました。
id | from | to | who | group | ...
1 | 2012-01-01 12:00:00 | 2012-01-01 14:00:00 | adam | sales
2 | 2012-01-01 12:00:00 | 2012-01-01 15:00:00 | bertil | sales
2 | 2012-01-01 12:00:00 | 2012-01-01 15:00:00 | bertil | admin
...
結果はDATE(from)でグループ化されます
しかし、時間の長さにも興味があり、その(UNIX_TIMESTAMP(to) - UNIX_TIMESTAMP(from))/3600
合計を日ごとにグループ化したいのですが、各IDを1回だけカウントしたいのです。
次のようなことを行うことはでき
SUM((UNIX_TIMESTAMP(to) - UNIX_TIMESTAMP(from))/3600 DISTINCT id)
ますか?または、変数とIF()を使用できますか?
または、idでグループ化されたbigクエリでサブクエリを実行してから、日付でグループ化された外部クエリを実行する必要がありますか?
UPDATE 1は、上記の結果が人々が働いた時間であり、彼らがメンバーであったグループであるとあなたが期待するものを明確にします
。現時点で興味深いグループを除外した後、どれだけの人員が費やされたか知りたいです。その日のデータ例:アダムの場合は2時間+ベルティルの場合は3時間= 5時間ですが、ベルティルは2つの興味深いグループのメンバーであるため、彼の時間は2回表示されます。
UPDATE2はもう少しデータを提供します
上記はこのクエリの一般化の試みでした
SELECT
worktimes.date AS 'Datum',
COUNT(DISTINCT employments.citizen_id) AS 'Säljare',
SUM(UNIX_TIMESTAMP(TIMESTAMP(worktimes.date, worktimes.death)) - UNIX_TIMESTAMP(TIMESTAMP(worktimes.date, worktimes.birth))) AS 'Mantid',
COUNT(DISTINCT agreements.agreement_id) AS 'Avtal',
COUNT(DISTINCT IF(agreement_status.status_id = 57, agreements.agreement_id, NULL)) AS 'Godkända',
COUNT(DISTINCT IF(agreement_status.status_id = 3, agreements.agreement_id, NULL)) AS 'Ånger',
COUNT(DISTINCT IF(agreement_status.status_id = 4, agreements.agreement_id, NULL)) AS 'Makuleringar',
COUNT(DISTINCT IF(agreement_status.status_id IS NULL, agreements.agreement_id, NULL)) AS 'Övrigt'
FROM worktimes
LEFT JOIN employments USING (employment_id)
LEFT JOIN membership_cache ON (
membership_cache.target_type = 34 AND
membership_cache.target_id IN (136, 138) AND
membership_cache.member_type = 11 AND
membership_cache.member_id = employments.citizen_id AND
DATE(membership_cache.birth) <= worktimes.date AND
(membership_cache.death IS NULL OR worktimes.date < DATE(membership_cache.death))
)
LEFT JOIN agreements ON (
agreements.citizen_id = employments.citizen_id AND
agreements.project_id = 20 AND
agreements.date >= 20110101 AND
DATE(agreements.date) = worktimes.date
)
LEFT JOIN agreement_status ON (
agreements.agreement_id = agreement_status.agreement_id AND
agreement_status.value = 1 AND
agreement_status.death IS NULL AND
agreement_status.status_id IN (3, 4, 57)
)
WHERE
worktimes.death IS NOT NULL AND
membership_cache.member_id IS NOT NULL AND
worktimes.date >= 20110101
GROUP BY DATE(agreements.date)
上記のクエリのmysqlEXPLAIN
+----+-------------+------------------+-------+------------------------------------------------------+------------------------+---------+-------------------------------+------+-----------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+------------------------------------------------------+------------------------+---------+-------------------------------+------+-----------------------------------------------------------+
| 1 | SIMPLE | membership_cache | range | target,member | target | 10 | NULL | 85 | Using where; Using index; Using temporary; Using filesort |
| 1 | SIMPLE | employments | ref | employment_id,citizen | citizen | 8 | db.membership_cache.member_id | 1 | Using where; Using index |
| 1 | SIMPLE | worktimes | ref | employment,date,death | employment | 8 | db.employments.employment_id | 34 | Using where |
| 1 | SIMPLE | agreements | ref | project,date,project_customer,agreements_per_citizen | agreements_per_citizen | 8 | db.employments.citizen_id | 36 | |
| 1 | SIMPLE | agreement_status | ref | agreement,status_birth,status_death | agreement | 8 | db.agreements.agreement_id | 1 | |
+----+-------------+------------------+-------+------------------------------------------------------+------------------------+---------+-------------------------------+------+-----------------------------------------------------------+
そして問題はSUM(UNIX_TIMESTAMP(TIMESTAMP(worktimes.date, worktimes.death)) - UNIX_TIMESTAMP(TIMESTAMP(worktimes.date, worktimes.birth))) AS 'Mantid'
、テーブル内の一致する行の数(membership_cache、agreements、agreement_status)が乗算されることです。