将表汇总并拆分为MySQL中的不同表

时间:2018-06-03 14:28:46

标签: mysql sql database

所以我有这个看起来像这样的表:

user_id  location  duration(s)
-------  --------  -----------
1        room1     75
2        room1     289
1        room2     630
1        room1     287

上表显示了用户在房间中的时长,行数表示用户在特定房间内的次数。因此,例如在上面的数据中,有2行,其中用户1在位置room1中,这意味着他已经在room1中两次。如何将这些数据转化为下表:

user_id  room_1_freq  room_1_duration  room_2_freq  room_2_duration
-------  -----------  ---------------  -----------  ---------------
1        2            181              1            630
2        1            289              0            0

room_1_freq和room_2_freq是用户进入相应房间的次数,room_1_duration和room_2_duration是用户在每个房间消费的平均时间。这可以在一个查询中完成吗?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,这只是条件聚合:

class Polygon:

   def __init__(self, num_of_sides):
       self.n= num_of_sides
       self.num_of_sides= int(input('Enter the number of sides: '))
       self.sides = []


   def sideLength(self):
       """This method appends all sides of the polygon into a list"""
       for i in range(self.n):
           side = int(input('Enter the length the side: ' + str(i+1) + ' : '))
           self.sides.append(side)
       print self.sides


class Triangle(Polygon):
    def __init__(self):
       Polygon.__init__(self,3)

    def findPeri(self):
       print  'The total area of your perimeter is: ',sum(self.sides)

答案 1 :(得分:1)

回答您的问题有一种更简单(也可能更灵活的方式)。您的辅助(结果)表将按照每个房间和每个需要报告的用户的列数呈指数级扩展,并且在我看来会变得难以管理。另外,使用Gordon的解决方案,每次添加用户或房间时都必须重写查询。

如果使用标准的sum,count和average函数在SQL中使用标准分组子句汇总数据,那么维护起来要容易得多:

SELECT user_id, location, count(location), sum(duration), avg(duration) 
FROM visits
group by user_id, location

这会为您提供所需的结果,但格式略有不同:

Sum, count and average function use in SQL

这样做,您可以添加许多您想要的房间和用户,并且摘要信息将始终有效。添加日期或时间列以过滤结果也非常容易。