我们可以使用不同的过滤条件在同一个表字段或列上多次使用相同的聚合函数吗?

Posted

技术标签:

【中文标题】我们可以使用不同的过滤条件在同一个表字段或列上多次使用相同的聚合函数吗?【英文标题】:Can we use same aggregate function more than once on same table field or column using Different filter conditions? 【发布时间】:2013-05-04 07:30:26 【问题描述】:

我想在查询中的“金额”字段上使用 SUM() 函数在同一字段上使用 4 次不同的过滤器。 类似

SELECT Date1,CC,BU, SUM(Amount),SUM(Amount),SUM(Amount),SUM(Amount)
FROM MainTable<br>
GROUP BY CC,BU,Date1

这里 第一个 SUM(Amount) 应该在 Mode='011'Mode='012' 来自 MainTable 时计算 当 Mode like '03_'Mode Like '05_' 来自 MainTable 时,应计算第二个 SUM(Amount)Mode like '10_' 来自 MainTable 时,应计算第三个 SUM(Amount) 第 4 个 SUM(Amount) 应在 MainTable 中的 (Mode !='011')(Mode !='012') (Mode not Like '03_')(Mode not Like '05_') 时计算

如何做到这一点?我尝试了很多方法,但无法达到我想要的结果。 请帮帮我。 提前谢谢你。

【问题讨论】:

【参考方案1】:

您可以使用带有 CASE 的聚合函数:

SELECT Date1,
  CC,
  BU, 
  SUM(case when mode = '011' then Amount end) Mode011,
  SUM(case when mode = '012' then Amount end) Mode012,
  SUM(case when mode = '013' then Amount end) Mode013,
  SUM(case when mode = '014' then Amount end) Mode014
FROM MainTable
GROUP BY CC,BU,Date1;

或者您可以使用 PIVOT 功能:

select date1, CC, BU,
  [011] Mode011, 
  [012] Mode012, 
  [013] Mode013, 
  [014] Mode014
from
(
  select date1, CC, BU, mode, amount
  from maintable
) src
pivot
(
  sum(amount)
  for mode in ([011], [012], [013], [014])
) piv

【讨论】:

我们可以在使用 AND 运算符的 case 语句中包含 2 个文件管理器吗?比如 (CASE when (mode = '012' And mode='015)' then Amount end) 我也需要使用通配符。有可能吗? @NishantBhuskade 是的,您可以在CASE 中使用多个过滤器,甚至是通配符

以上是关于我们可以使用不同的过滤条件在同一个表字段或列上多次使用相同的聚合函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

Excel数据透视表MDX慢?

多次加入同一个表以每次使用过滤器检索不同的数据

MS Access 使用表字段作为查询条件

如何同时对多个表或列操作

Oracle的优化

MYSQL过滤表中某几个字段重复的数据