我有一个与 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 |
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