Sql server SQL将函数应用于多个id行
我正在使用SQL Server 2008,并尝试收集表中多行中出现的单个客户数据,我的数据库示例如下:Sql server SQL将函数应用于多个id行,sql-server,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
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 server中定义。有没有更好的通用方法来解决这个问题,不需要定义很多id 评估值并相应应用聚合函数的用例
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
1102
从何而来?类型标志背后的逻辑是什么?为什么输出中的两条记录都有1作为typeFlag
?这正是我想要的,谢谢!