【问题标题】:Trouble in showing SUM() value of a column显示列的 SUM() 值时出现问题
【发布时间】:2013-08-10 01:33:58
【问题描述】:

您好,来自 StackOverflow 的同事们!

我会简短,切入正题:

我在 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 存档,发现了类似的东西,但没有任何帮助。

通过互联网搜索,我得出的结论是,这个问题可以通过数据透视表解决,但我不知道如何正确使用它们。如果是这样的话,如果数据透视表可以解决这个问题,一些链接将不胜感激。

如果还有什么我可以帮忙的,请提出来,我会很乐意的。

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

【问题讨论】:

  • 这一点都不简短sscce
  • 虽然我试过了,但我无法缩短它...

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


【解决方案1】:
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()

但是,重要的是要在 group by 中准确地重复选择列表中的第一个表达式。

【讨论】:

  • 我已经更改了别名,因为 Access 报错了,但是当我在 Access 中运行查询时,会出现一个对话框,询问 Type1 的参数值。我尝试输入 Type1,并显示另一个对话框向上。和以前一样,但是参数是针对Type2的,所以我输入了Type2。查询然后运行,但结果不正确。有什么想法为什么会这样吗?我应该编辑问题并发布代码/屏幕截图吗?
  • 这是我的查询。我在我的问题中更改了表格的名称,以获得更好的清晰度:选择IIF('Домашинства','саобрашај'),“其他类型”),“其他类型”)作为[Типобјекта],和(Инсталисана_топлотна_снага)作为[和(InstaledPower )] 来自 IIF 的 Објекат 组(Тип_објекта in('Домаћинства', 'Саобраћај'), Тип_објекта, 'OtherTypes');我想它和你的一样。我现在找不到错误......
  • 我又重新输入了字段名称,它成功了!我现在需要做的就是在我的 C++ 代码中尝试一下。在使用 IIF 之前我遇到了麻烦,但希望它现在可以工作......
  • @FrankPl,非常感谢您的帮助,您已经 +1 来自我!
【解决方案2】:
   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;

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

【讨论】:

  • 在 Access 中尝试后,我收到此错误消息:Select statement includes a reserved word or an argument name that is mispelling or missing or punctuation is wrong.我在 SUM 后面添加了括号,并更改了!= to 。我真的不知道为什么会报错。
  • 我在 sum 语句末尾缺少“)”。请重试。
  • 我一开始已经更正了,然后就报错了。
  • 这是我收到的错误消息:Select 语句包含一个保留字或拼写错误的参数名称
  • 你有眼光!我在Access中运行查询时,出现一个对话框,询问Type1的参数值。我尝试输入Type1,又出现一个对话框。和以前一样,但是参数是Type2的,所以我输入了Type2。查询然后运行,结果是正确的。有什么想法为什么会发生这种情况吗?我应该编辑问题并发布代码/截图吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
相关资源
最近更新 更多