SQL 多个条件求和

SQL Sum If with Multiple Criteria

我有这些 table:

people(personID, name)

expenses(personID, contract, labor, materials, travel, class)

费用的“class”栏table可以有3个选项,a、b、c。这三个 classes 是劳动力 + 材料 + 旅行如何使用的另一种细分。所以基本上,人工 + 材料 + 差旅 = a + b + c。我刚刚意识到也许这个 table 应该设计不同......也许劳动力、材料和旅行也应该是行项目而不是列。但无论如何...

我想得到这个查询:

PersonName, Contract, Labor, Materials, Travel, Total, A, B, C

Where Total = Labor + Materials + Travel = A + B + C

这可能吗?

编辑:

ID, Contract, Labor, Materials, Travel, Class

1, Blockbuster, , , , 'A'

1, Blockbuster, [=13=], , , 'B'

我想在最后得到这个查询

ID, Contract, Labor, Materials, Travel, Total, A, B

1, Blockbuster, , , , , ,

嗯,查询,你要找的是:

SELECT 
 (select name from people as p where p.personid=e.personID) AS name, 
 contract, 
 Sum(labor) AS sum_labor, 
 Sum(materials) AS sum_materials, 
 sum(travel) AS sum_travel, 
 Sum(Labor+Materials+Travel) AS total, 
 Sum(IIf(class='A',Labor+Materials+Travel,0)) AS A, 
 Sum(IIf(class='B',Labor+Materials+Travel,0)) AS B, 
 Sum(IIf(class='C',Labor+Materials+Travel,0)) AS C
FROM expenses as e
GROUP BY contract, personID;

关于应该如何存储数据的想法...好吧,这是一个复杂的问题。

  • 如果你想收集关于改变的数据,你应该存储以前的值,改变的时间和改变的人。
  • 如果你想在你的数据中达到更大的规范化(例如对于索引,当你有很多数据和报告时),你应该添加类型(人工、材料、差旅)和存储费用金额在一列中(即列将是 personID、contract、type、class、amount)。
  • 等等....

    但是!我不知道你的任务,也不知道你通过这个数据库实现的目标是什么。如果您当前的数据足够了 - 不要因此而失眠。