0

いくつかの結合を行った後、次のようなグループ化されていない結果/ビューを取得しました。

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)が乗算されることです。

4

0 に答える 0