繁体   English   中英

根据各列之间的比较将最大值的列名称分配给行

[英]Assign column name of max value to row based on comparison across columns

OID_ _ HOS1 _ _ HOS2 _ _ HOS3   
 A _ _ _ _ 3 _ _ _ _ _7 _ _ _ _10  
 B _ _ _ _ 12 _ _ _ _ 5 _ _ _ _ 8   
 C _ _ _ _ 3 _ _ _ _ 13_ _ _ _ 7  

考虑给定区域(OID)中的此医院就诊表。 我想做的是在sql中自动确定上表的最后两列。 我想比较每个区域(A,B,C)的所有医院访问次数(HOS1,HOS2,HOS3),并为每个区域的MAXV列分配最高访问次数,并为访问次数最高的医院代码到MAXH列,使其看起来像下表。

OID_ _ HOS1 _ _ HOS2 _ _ HOS3 _ _ MAXV _ _ MAXH  
 A _ _ _ _ 3 _ _ _ _ _ 7_ _ _ _ _ 10 _ _ _ 10 _ _ _ HOS3  
 B _ _ _ _ 12 _ _ _ _ 5 _ _ _ _ _ 8 _ _ _ _12 _ _ _ HOS1  
 C _ _ _ _ 3 _ _ _ _ 13 _ _ _ _ _ 7 _ _ _ _13 _ _ _ HOS2

对于SQL Server 2005+:

SELECT T.*, C.ColValue MAXV, C.ColName MAXH
FROM YourTable T
OUTER APPLY (SELECT TOP 1 *
             FROM (SELECT 'HOS1', HOS1
                   UNION ALL
                   SELECT 'HOS2', HOS2
                   UNION ALL
                   SELECT 'HOS3', HOS3) X(ColName,ColValue)
             ORDER BY ColValue DESC) C

这是一个演示。 结果如下:

╔═════╦══════╦══════╦══════╦══════╦══════╗
║ OID ║ HOS1 ║ HOS2 ║ HOS3 ║ MAXV ║ MAXH ║
╠═════╬══════╬══════╬══════╬══════╬══════╣
║ A   ║    3 ║    7 ║   10 ║   10 ║ HOS3 ║
║ B   ║   12 ║    5 ║    8 ║   12 ║ HOS1 ║
║ C   ║    3 ║   13 ║    7 ║   13 ║ HOS2 ║
╚═════╩══════╩══════╩══════╩══════╩══════╝
select
    t.[OID], t.[HOS1], t.[HOS2], t.[HOS3],
    c.MAXV, c.MAXH
from Table1 as t
    outer apply (
        select top 1 *
        from (values
           (HOS1, 'HOS1'),
           (HOS2, 'HOS2'),
           (HOS3, 'HOS3')
        ) as a(MAXV, MAXH)
        order by a.MAXH desc
    ) as C

sql小提琴演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM