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)。
等等....
但是!我不知道你的任务,也不知道你通过这个数据库实现的目标是什么。如果您当前的数据足够了 - 不要因此而失眠。
我有这些 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;
关于应该如何存储数据的想法...好吧,这是一个复杂的问题。
但是!我不知道你的任务,也不知道你通过这个数据库实现的目标是什么。如果您当前的数据足够了 - 不要因此而失眠。