SQL将函数应用于多个id行

时间:2017-11-21 12:58:32

标签: sql-server

我正在使用SQL Server 2008,并尝试收集出现在我的表中多行的单个客户数据,我的数据库示例如下:

custID | status | type  | value 
-------------------------
1      | 1      | A     | 150
1      | 0      | B     | 100
1      | 0      | A     | 153
1      | 0      | A     | 126
2      | 0      | A     | 152
2      | 0      | B     | 101
2      | 0      | B     | 103

对于每个custID,我的任务是找到一个标志,如果任何行的status = 1,任何行的type = B,以及type = B的所有情况下的平均值。所以我的解决方案应该是这样的:

custID | statusFlag | typeFlag  | valueAv 
-------------------------------------------
1      | 1          | 1         | 100
2      | 0          | 1         | 102

我可以使用大量的row_number()over(partition by ..),创建id,并为每列选择所需的id创建子表来获得答案。我的问题是这个方法既笨拙又耗时,因为我有比上面显示的更多的列来完成这个,并且有许多表重复它。我理想的解决方案是定义我自己的aggregate()函数,所以我可以这样做:

select custID, ag1(statusFlag), ag2(typeFlag)
group by custID

但据我所知,自定义聚合不能在SQL服务器中定义。是否有一个更好的通用方法来解决这个问题,并不需要定义大量的id?

1 个答案:

答案 0 :(得分:1)

使用CASE WHEN来评估值并相应地应用聚合函数

select  custID,
        statusFlag  = max(status),
        typeFlag    = max(case when type = 'B' then 1 else 0 end),
        valueAv     = avg(case when type = 'B' then value end)
from    samples
group by custID