SQL Server-根据对第2列值的检查返回正确的第1列值

时间:2018-06-27 18:51:54

标签: sql sql-server

数据:

| id | Year        | CPT    | RVU   | MOD |
+----+-------------+--------+-------+-----+
| 1  | 2015        | 99212  | 12    | 26  |
| 2  | 2015        | 99212  | 23    | TC  |
| 3  | 2015        | 99212  | 56    |     |
| 4  | 2015        | 99213  | 59    | 53  |
| 5  | 2015        | 99214  | 60    |     |
| 6  | 2015        | 99215  | 99    | 53  |
| 7  | 2015        | 99216  | 78    |     |

输出:

对于CPT 99212,返回RVU = 12

对于CPT 99213,返回RVU = 59

对于CPT 99214,返回RVU = 60

为CPT 99215返回RVU = 99

CPT的MOD可以为26,TC,53或NULL。我的SQL需要先检查26,如果有26,然后返回该行的RVU,如果不是26,则剩下任何其他内容。

措辞不同:如果CPT没有MOD 26,则该CPT将只有一个可能的其他MOD供选择。如果CPT具有MOD 26,则它将始终具有随附的TC和NULL MOD。如果CPT没有26 MOD,那么无论MOD如何,我都需要获取任何可用的RVU值。因此,操作顺序是先检查26,然后在该行返回RVU,如果没有,则返回该CPT的唯一可能的RVU选择。

3 个答案:

答案 0 :(得分:0)

您可以按{em>有条件的顺序使用row_number()函数:

select top (1) with ties *
from table t
order by row_number() over (partition by cpt 
                                 order by (case when mod = '26' then 0 else 1 end)
                           );

答案 1 :(得分:0)

使用row_number()。我认为优先顺序如下:

select t.*
from (select t.*,
             row_number() over (partition by cpt
                                order by (case mod when '26' then 1 when 2 end)
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

答案 2 :(得分:0)

您可以进行自我联接,以在单独的虚拟表中获取带有26 mod的CPT。

示例数据创建:

declare @Data table
(   id int identity
    ,[year] int default 2015
    ,CPT nchar(5)
    ,RVU nchar(2)
    ,[MOD] nchar(2)
)

insert into @Data
(CPT, RVU, [MOD])
values
('99212', '12', '26'),
('99212', '23', 'TC'),
('99212', '56', null),
('99213', '59', '53'),
('99214', '60', null),
('99215', '99', '53'),
('99216', '78', null)

查询:

select
    Data.CPT
    ,case
        when Is26.CPT is not null then Is26.RVU
        else Data.RVU
    end  RVU
from @Data Data
    left join @Data Is26 on
        Is26.CPT = Data.CPT
        and Is26.[MOD] = '26'
group by
    Data.CPT
    ,case
        when Is26.CPT is not null then Is26.RVU
        else Data.RVU
    end