SQL - 列按列名称合并和分组,同时对其他列求和

问题描述 投票:0回答:1

我有一个与 SQL 查询相关的问题。数据如下:

姓名1 姓名2 类别 总计
ABC 类别1 100
防御 ABC 类别1 20
GHI ABC 类别3 300
XYZ 防御 类别2 60
XYZ GHI 类别3 80
类别2 90

我正在尝试合并

Name1
Name2
并根据
Category
对它们进行分组,如果相同的名称具有相同的类别,则
Total
具有总和。

提前致谢

我尝试的方法是这样的(有点类似于 stackoverflow 中提出的这两个查询): 匹配两列并在 SQL 中添加第三列 SQL:GROUP BY B 列用于 a 列中的组

pysqldf = lambda q1: sqldf(q1, globals())
q1 = """SELECT Name, SUM(Total) AS Total
FROM
(
    SELECT Name1 AS Name, SUM(Total) AS Total
    FROM df
    WHERE Name1 IS NOT NULL
    GROUP BY Name1
    UNION ALL
    SELECT Name2, SUM(Total)
    FROM df
    WHERE Name2 IS NOT NULL
    GROUP BY Name2
) t
GROUP BY Name
ORDER BY Name"""
df2 = pysqldf(q1)

也在 pandas 中尝试过,但使用以下命令给出了不同的结果:

df2 = df.groupby(['investigator','second_investigator','requested_test']).agg({'Count': 'sum'})

需要的输出是这样的:

姓名 类别 总计
ABC 类别1 120
ABC 类别3 300
防御 类别1 20
防御 类别2 60
GHI 类别3 380
XYZ 类别2 60
XYZ 类别3 80
mysql group-by sum
1个回答
0
投票
SELECT Name, Category, SUM(Total) AS Total
FROM
(
    SELECT Name1 AS Name, Category, SUM(Total) AS Total
    FROM df
    WHERE Name1 IS NOT NULL
    GROUP BY 1, 2
    UNION ALL
    SELECT Name2, Category, SUM(Total)
    FROM df
    WHERE Name2 IS NOT NULL
    GROUP BY 1, 2
) t
GROUP BY 1, 2
ORDER BY 1

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.