基于组标准的T-SQL条件最大值或总和

时间:2017-10-26 21:54:12

标签: sql-server tsql aggregates

我无法弄清楚这一点,我想找出最有效的方法。我有这张桌子(显示部分记录):

prefix  FolioNumber  CmmtAmount  CmmtNumber
------- -----------  ----------  ----------
100981  10098100005         1    100981100
100981  10098100006         3    100981100
100981  10098100007         9    100981100
100981  10098100009         2    100981100
100981  10098100010         6    100981100
600499  60049900001         0    NULL
600499  60049900003         2    600499300
600499  60049900004         5    600499500

从该表中我需要提出这个结果集:

prefix  CmmtAmount
------  ----------
100981         9
600499         7

这是逻辑:

对于每个前缀

  • 如果有多个但相同的 CmmtNumber 记录,请选择 一个MAX( CmmtAmount
  • 如果有多个但不同的 CmmtNumber 记录, 显示所有这些记录的SUM( CmmtAmount )。

我一直在寻找OVER / PARTITION,但无法提出正确的查询。请帮忙!感谢。

2 个答案:

答案 0 :(得分:4)

使用CASE WHEN

select
  prefix,
  case when min(CmmtNumber) = max(CmmtNumber) then max(CmmtAmount) 
                                              else sum(CmmtAmount) 
  end as CmmtAmount
from mytable
group by prefix
order by prefix;

答案 1 :(得分:1)

我不确定,如果我完全理解你的要求,但我会试一试:

SELECT Prefix, MAX(CmmtAmount) 
FROM YOUR_TABLE 
GROUP BY Prefix
HAVING MIN(CmmtNumber)=MAX(CmmtNumber)
UNION 
SELECT Prefix, SUM(CmmtAmount) 
FROM YOUR_TABLE 
GROUP BY Prefix 
HAVING MIN(CmmtNumber) != MAX(CmmtNumber)

我希望,这适合你。