2016-12-09 11 views
0

概要を作成しようとしています。テーブルの下に があります。Mysqlユーザーは自分自身と比較します

Table example

ので、ユーザ2は、ユーザ1のために9時間を行っているが、ユーザー1は、使用者1から起因合計は6時間であるユーザ2のために3時間行いました。ユーザ2は通話時間にユーザ3,2を負っています。どのように私はMysqlのすべてのユーザーからの相互参照テーブルを作ることができますか?

enter image description here

答えて

1

まず、これはSQLで行うには自然なことではありません。しかし、それは可能です。あなたがでても、ユーザー数に調整された列の動的な番号を持つことはできません

select user_id_a, 
     sum(case when user_id_b = 1 then hours_oncall else 0 end) as user_1, 
     sum(case when user_id_b = 2 then hours_oncall else 0 end) as user_2, 
     sum(case when user_id_b = 3 then hours_oncall else 0 end) as user_3 
from ((select user_id_a from t 
    ) union 
     (select user_id_b from t 
    ) 
    ) u left join 
    t 
    on t.user_id_a = u.user_id_a 
group by u.user_id_a; 
+0

ので、私は、ダイナミックなユーザーのリストを生成することはできませんか?ユーザーは年間を通じて変更する予定ですか? – Roelofzo

+0

@Roelofzo。 。 。このタイプの変換は、アプリケーションレイヤーやExcelのピボットテーブルなどのツールを使用して実際に行う方が効果的です。つまり、可能です。 –

+0

列の数を動的にすることはできません。しかし、すべての組み合わせ(ユーザーの2乗からユーザーの行まで) – ysth

0

プレーンSQLで:相互参照表を作成するには、行を生成して、列を入力する必要がありますあなたのコードはそれを行うSQLを生成することができます。しかし、私はあなたのコード内のピボットテーブルのようなデータを変換して何時間に何人の人に借りているのかを示す行を取得する方が良いと思います。

あなたのテーブルがhours_oncall呼ばれると仮定すると、基本的なデータを取得するには:

select ower,owed,sum(hours_oncall) hours 
from (
    select user_id_a ower,user_id_b owed,hours_oncall from hours_oncall 
    union all 
    select user_id_b,user_id_a,-hours_oncall from hours_oncall 
) hours_oncall_union 
group by 1,2 
having hours>0; 

あなたのサンプルデータについては、返します

+------+------+-------+ 
| ower | owed | hours | 
+------+------+-------+ 
| 1 | 2 |  6 | 
| 2 | 3 |  2 | 
+------+------+-------+ 
関連する問題