2013-10-14 19 views
2
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 

回答

2
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 fiddle demo

+2

我更喜欢垂直格式 –

+0

@ypercube是的,你的权利,试图格式化它,看它是否好看,但它显然不是,而且很难添加行:) –

3

对于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 

Here is的这个演示。 这里是结果:

╔═════╦══════╦══════╦══════╦══════╦══════╗ 
║ OID ║ HOS1 ║ HOS2 ║ HOS3 ║ MAXV ║ MAXH ║ 
╠═════╬══════╬══════╬══════╬══════╬══════╣ 
║ A ║ 3 ║ 7 ║ 10 ║ 10 ║ HOS3 ║ 
║ B ║ 12 ║ 5 ║ 8 ║ 12 ║ HOS1 ║ 
║ C ║ 3 ║ 13 ║ 7 ║ 13 ║ HOS2 ║ 
╚═════╩══════╩══════╩══════╩══════╩══════╝