python - MySql/Python 中的混合列求和

标签 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()

最佳答案

你根本不需要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;

关于python - MySql/Python 中的混合列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24604446/

相关文章:

python - 如何准确计算每天 DataFrame 中 NaN 的百分比变化?

php - 如何从表格的一列中删除 � 这个符号?

php - MySQL 查询(使用 JOIN)只检索第一行

带有 MySQLi 提取的 PHP 不会在 LEFT JOIN 上返回带有 NULL 的行

sql - mysql中 'IN'子句中的倍数 'WHERE'表达式求值

python - 有没有更优雅的方式来读取 CSV 列并与记录 ID 合并?

python - 如何阻止 Item Delegate 阻止 mousePressEvent

python - 通过特定分隔符进行字符串操作并写入文本文件

python - 将列中的任意字符串替换为 1

php - Laravel:单击按钮更新列的值