我正在使用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?
答案 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