显示列的SUM()值时出现问题

时间:2013-08-10 01:33:58

标签: c++ sql ms-access-2007 ado

HelloOverflow的同事们,您好!

我会简短,切入点:

我在Windows XP上使用C ++工作,使用ADO访问MS Access 2007数据库。

我在MS Access 2007中有一个表,其中包含2个感兴趣的列,标题为TypeOfObject和InstaledPower。

实际的表看起来像这样:

   | TypeOfObject | InstaledPower |
   -------------------------------
   |     Type1    |     1000      |
   -------------------------------
   |     Type2    |     2000      |
   -------------------------------
   |     Type3    |      450      |
   -------------------------------
   |     Type4    |      800      |   
   -------------------------------
   |     Type1    |      800      |  
   -------------------------------

我需要一个查询,以这种方式显示该类型的TypeOfObject和sum(InstaledPower):

如果TypeOfObject的值为Type1或Type2,则表示未更改表中的值,否则将其标记为OtherTypes。结果应该是这样的:

   | TypeOfObject | SUM(InstaledPower) |
   -------------------------------------
   |     Type1    |     1800           |  <--- 1000 + 800 = 1800
   -------------------------------------
   |     Type2    |     2000           |  <--- only one Type2, so it is 2000
   -------------------------------------
   |   OtherTypes |     1250           |  <--- sum( InstaledPower ) of Type3 and Type4
   ------------------------------------

我尝试过这个查询:

   SELECT TypeOfObject , 
   SUM( InstaledPower  ) as [SUM(InstaledPower)] 
   FROM MyTable
   group by TypeOfObject  ;

但我明白了:

   | TypeOfObject | SUM(InstaledPower) |
   -------------------------------------
   |     Type1    |     1800           | <--- correct
   -------------------------------------
   |     Type2    |     2000           |
   -------------------------------------
   |     Type3    |      450           | <--
   -------------------------------------    |-- this isn't what I need, see above
   |     Type4    |      800           | <--  
   -------------------------------------

我试过浏览SO档案,发现了类似的事情,但没有什么可以帮助我的。

通过互联网搜索,我得出的结论是这个问题可以通过数据透视表来解决,但我不知道如何正确使用它们。如果是这种情况,如果数据透视表可以解决这个问题,一些链接非常感谢。

如果还有其他任何我可以提供的帮助,请问,我很乐意这样做。

感谢所有试图提供帮助的人。

2 个答案:

答案 0 :(得分:3)

SELECT IIF(TypeOfObject in('Type1', 'Type2'), TypeOfObject, 'OtherTypes') as TypeOfObject , 
       SUM( InstaledPower  ) as [SUM(InstaledPower)] 
       FROM MyTable
 group by IIF(TypeOfObject in('Type1', 'Type2'), TypeOfObject, 'OtherTypes')

我不确定此语法在Access 2007中是否有效,某些数据库更喜欢case表达式而不是IIF()

然而,重要的是,要完全在组中重复选择列表中的第一个表达式。

答案 1 :(得分:0)

   SELECT TypeOfObject , 
   SUM(IIF(TypeOfObject = 'Type1', InstaledPower, 0)) as [Type1Sum],
   SUM(IIF(TypeOfObject = 'Type2', InstaledPower, 0)) as [Type2Sum],
   SUM(IIF(TypeOfObject <> 'Type2' 
           AND TypeOfObject <> 'Type2', InstaledPower , 0)) as [OtherTypeSum]
   FROM MyTable
   group by TypeOfObject;

[您可能仍需要转动行。]