在第一行获取条件 SUM

Posted

技术标签:

【中文标题】在第一行获取条件 SUM【英文标题】:Get conditional SUM in first row 【发布时间】:2013-11-02 01:54:30 【问题描述】:

我有桌子=>

Main Table  : MT
================
PK SPK Name D1 
==============
1, 0, XYZ, 0
1, 1, A, 99
1, 2, B, 88
1, 3, C, 77
2, 0, NULL, 0
2, 1, NULL, 99
2, 2, Z, 88

我想从中得到

Result Table  : RT
================
PK SPK Name D1 
==============
1, 0, XYZ, 264
1, 1, A, 99
1, 2, B, 88
1, 3, C, 77
2, 0, NULL, 187
2, 1, NULL, 99
2, 2, Z, 88

对于每个 SPK=0 而不是 0 的 PK,我希望第一行中的 D1 总和。

此外,当 SPK=0 时,D1 始终为 0。我想根据 PK 值在 SPK=0 的 D1 字段中显示 SUM。

有什么方法可以在第一行获取 D1 的 SUM 而不是 SPK=0 的 0?

【问题讨论】:

我不知道该怎么做。提前感谢您的回答。 【参考方案1】:

使用排名功能(sqlserver 2005+)

select PK, SPK, Name,
case when SPK = 0 then sum(D1) over (partition by pk)
else D1 end as D1
from table
order by PK, SPK

【讨论】:

谢谢。当有更多列时,这是最好的方法。【参考方案2】:
SELECT 
    t.pk, 
    t.spk, 
    t.name, 
    CASE WHEN t.spk = 0 THEN ts.d1 ELSE t.d1 END AS d1
FROM your_table t
LEFT JOIN ( 
        SELECT tt.pk, SUM(tt.d1) AS d1 
        FROM your_table tt 
        GROUP BY tt.pk 
    ) ts ON t.pk = ts.pk

【讨论】:

不错的一个。把LEFT去掉就行了,没必要。【参考方案3】:
select PK, SPK, Name,
  case when SPK = 0 then ( select Sum( D1 ) from ThineTable where PK = TT.PK )
    else D1 end as D1
  from ThineTable as TT
  order by PK, SPK

【讨论】:

以上是关于在第一行获取条件 SUM的主要内容,如果未能解决你的问题,请参考以下文章

Excel - UDF 函数,用于根据条件从多个工作表中获取 SUM 值

SQL使用group by获取SUM,但有条件地对两列之一的内容求和

如何根据条件获取列名

如何获得每个状态的第一行?

如果在 R 中满足条件,则从前一行获取值并连接

根据熊猫数据框中的条件获取最大值和最小值