【发布时间】:2021-08-15 08:24:40
【问题描述】:
我有一个项目网站,需要在一个列中汇总所有预算类别。
例如,我有一列包含:
分类:
水、电、煤气、租金、住院费、医药、个人护理、健身,
我要选择总和
水、电、气、租金
并将其命名为水电费。
与总和相同
住院费、医药费、个人护理、健身
作为医疗保健。
我应该使用什么sql语句?
任何帮助将不胜感激
【问题讨论】:
标签: mysql sql database group-by
我有一个项目网站,需要在一个列中汇总所有预算类别。
例如,我有一列包含:
分类:
水、电、煤气、租金、住院费、医药、个人护理、健身,
我要选择总和
水、电、气、租金
并将其命名为水电费。
与总和相同
住院费、医药费、个人护理、健身
作为医疗保健。
我应该使用什么sql语句?
任何帮助将不胜感激
【问题讨论】:
标签: mysql sql database group-by
您可能会有其他表格,或此表格上的另一列,将特定账单映射到一般组或类别
然后您将运行一个查询,例如(如果您将类别组放在主表中)
SELECT categorygroup, sum(amount)
FROM bills
GROUP BY categorygroup
或者(如果你有单独的表加入)
SELECT bcg.categorygroup, sum(amount)
FROM bills b INNER JOIN billcategorygroups bcg ON b.category=bcg.category
GROUP BY bcg.categorygroup
然后您将维护表格,例如(主表格样式中的类别):
Bills
Category, CategoryGroup, Amount
---
Electricity, Utility, 123
Water, Utility, 456
或者(单独的表格以组样式映射类别)
BillCategoryGroups
Category, CategoryGroup
---
Water, Utility
Electricity, Utility
等等
必须映射电力 -> 公用事业、水 -> 公用事业等。我可能会有一个单独的表,因为它很容易重组。如果您决定 Cellular 不再是 Utility 而是 Personal,那么只需在映射表中更改它就会更改所有报告。它还有助于防止拼写错误和影响报告的数据输入错误 - 如果您使用单表路由,甚至将一张电费账单记为 Utitily,它就会在报告中获得自己的行。使用单独的表格也可以轻松添加新类别。所有这些事情都可以通过单表和大更新语句等来完成,但我们有充分的理由对数据进行“规范化”
【讨论】:
您可以使用条件聚合。喜欢
SELECT project,
SUM(CASE WHEN category IN ('water','electricity','gas','rentals')
THEN spent
ELSE 0
END) AS bills,
SUM(CASE WHEN category IN ('hospital fees','medicine','personal care','fitness')
THEN spent
ELSE 0
END) AS healthcare
FROM datatable
GROUP BY project;
但是数据规范化是最好的选择。所有类别都必须移动到单独的表格中。请参阅Caius Jard 的回答。
【讨论】: