我想通过SQL找出2个人之间的通话时间。 假设“乔”叫“ Mak”说了5分钟,而“马克”叫“ Joe”说了15分钟,则总持续时间必须为20分钟。
我尝试通过自加入进行某些操作,但此类调用得到了重复。
SELECT t1.cal1, t2.cal2,sum(t1.dur) as Total
from tele t1
INNER JOIN tele t2
ON (t1.cal1 = t2.cal1 AND t1.cal2 = t2.cal2)
GROUP BY T1.CAL1, T2.CAL2;
cal1 cal2 duration (in Mins)
A B 5
A B 10
B A 10
B A 25
A D 1
D C 2
B C 4
C B 9
C B 7
C A 2
D C 5
D B 10
答案 0 :(得分:3)
更简单的方法是使用CASE,以便获得col1和col2的唯一组合,然后按每个组合分组:
SELECT
case when cal1 < cal2 then cal1 else cal2 end col1,
case when cal1 < cal2 then cal2 else cal1 end col2,
SUM(duration) duration
FROM tele
GROUP BY col1, col2
请参见demo。
结果:
> col1 | col2 | duration
> :--- | :--- | -------:
> A | B | 50
> A | C | 2
> A | D | 1
> B | C | 20
> B | D | 10
> C | D | 7
如果您使用SQLServer,则需要这样做:
SELECT
case when cal1 < cal2 then cal1 else cal2 end col1,
case when cal1 < cal2 then cal2 else cal1 end col2,
SUM(duration) duration
FROM tele
GROUP BY
case when cal1 < cal2 then cal1 else cal2 end,
case when cal1 < cal2 then cal2 else cal1 end
或将CASE语句替换为
答案 1 :(得分:1)
您将必须在子查询中动态设置列,然后再次将其结果分组以实现所需的结果:
SELECT
col1, col2, SUM(duration)
FROM
(
SELECT
IF(cal1 < cal2, cal1, cal2) AS col1,
IF(cal1 < cal2, cal2, cal1) AS col2,
SUM(duration) AS duration
FROM
tel
GROUP BY
cal1,
cal2
) AS m
GROUP BY
col1,
col2
答案 2 :(得分:0)
如果A到B的呼叫等效于B到A的呼叫,那么如果您创建由双方名称组成的组合列,则可能会有所帮助-例如AB-组合中名称的顺序由字符串的排序顺序决定。
例如CASE WHEN A < B THEN A + B ELSE B + A END AS party_names
。
这将确保从A到B的呼叫以及从B到A的呼叫都导致AB party_names
。
然后您可以GROUP BY并选择该列和SUM(duration)。
答案 3 :(得分:0)
大多数数据库支持least()
和greatest()
:
select least(t.cal1, t2.cal2), greatest(t.cal1, t2.cal2),
sum(t1.dur) as Total
from tele t1
group by least(t.cal1, t2.cal2), greatest(t.cal1, t2.cal2);
对于没有的数据库,可以改用case
表达式。