在MySql / Python中汇总混合列

时间:2014-07-07 06:44:57

标签: python mysql

我有一个mysql表,它有一些整数字段和一些文本字段。在文本字段内部,我有多个用逗号分隔的数字。

我需要的是通过将所有列组合两个特定键来返回结果。求和时,我想总结所有整数字段(这是直截了当的)以及所有文本字段,其中每个逗号分隔值应分别相加。

如果没有示例,我无法更清楚地解释它,这就是我想要的

Table:
Key1    |Key 2  |Col1   |Col2   |Col3   |
A       |X      |2      |12     |2,4,6  |
A       |X      |4      |23     |3,6,9  |
A       |Y      |6      |54     |1,3,5  |
A       |Y      |8      |27     |4,8,12 |
B       |X      |1      |12     |5,10,5 |
B       |X      |3      |31     |6,3,1  |
B       |Y      |5      |23     |1,0,0  |
B       |Y      |7      |91     |2,5,6  |

Output I want:
Key1    |Key 2  |Col1   |Col2   |Col3   |
A       |X      |6      |35     |5,10,15|
A       |Y      |14     |81     |5,11,17|
B       |X      |4      |43     |11,13,6|
B       |Y      |12     |114    |3,5,6  |

我使用mysql和python将输出存储到新表。对于整数字段,我很容易使用mysql SUM()函数。对于Col3,我使用python map(add,a,b)函数来单独添加值。

问题是,我使用的代码看起来很丑陋,而且当我处理大量数据时,我认为它效率低下。有效这样做的任何建议吗?

我目前的代码代表:

cursor = cnx.cursor()
sqlout = "INSERT INTO tb2 (`key1`,`key2`,`col1`,`col2`) SELECT `key1`,`key2`,SUM(`col1`),SUM(`col2`) FROM tb1 GROUP BY `key1`,`key2`"
cursor.execute(sqlout)  // TESTED
cnx.commit()
sqlint = "SELECT `key1`,`key2`,`col3` FROM tb1"
cursor.execute(sqlint)
results = cursor.fetchall()
myres = {}
for row in results:
    myres[row[0],row[1]]= (map(add,myres[row[0],row[1]],row[2])
//USE MYSQL UPDATE COMMAND TO UPDATE tb2 from myres variable // NOT TESTED
cursor.close()
cnx.close()

1 个答案:

答案 0 :(得分:1)

你根本不需要Python,你可以在普通的MySQL中完成。首先,定义一些帮助:

create function column1(x text) returns integer deterministic
    return substring_index(x,',',1);

create function column2(x text) returns integer deterministic
    return substring_index(substring_index(x,',',-2),',',1);

create function column3(x text) returns integer deterministic
    return substring_index(substring_index(x,',',-1),',',1);

然后,这是查询:

select 
    Key1, Key2, 
    sum(Col1) as Col1,
    sum(Col2) as Col2, 
    concat_ws(',', 
        cast(sum(column1(Col3)) as char(50)),
        cast(sum(column2(Col3)) as char(50)),
        cast(sum(column3(Col3)) as char(50))
    ) as Col3
from YourTable
group by Key1, Key2;