我正在尝试创建一个概述谁欠谁的电话时间。 在我的桌子下面。
因此用户2已经为用户1完成了9小时,但是用户1已经为用户2完成了3小时,因此来自用户1的总欠款是6小时。并且用户2在通话时间内欠用户3。如何从Mysql中的所有用户创建交叉引用表?
答案 0 :(得分: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;
答案 1 :(得分: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 |
+------+------+-------+