首页 > 解决方案 > 如何使用sql只返回一行中的一部分值

问题描述

下面是我在 SQL Server 中的表,

Title           value
-------------   -------
abc_ef_1_123    53.2
abc_ef_1_1      43.2
abc_ef_1_11     23.1
abc_ef_1_12     45.2
abc_ef_1_13     56.4
def_cef_3_23    98.1
def_cef_3_3     53.2
def_cef_3_12    43.2
def_cef_3_13    23.1
def_cef_3_123   45.2

需要按第三个“_”之前的值对行进行分组,如下所示,

从 table1 按标题分组选择标题,最大值(值)作为值;

结果应该是,

title     value
--------- -----
abc_ef_1  56.4
def_cef_3 98.1

请协助。

标签: sqlsql-server

解决方案


我相信这会很好地完成工作(用你的表名替换“测试”):

;with cte as (
  select 
    left(Title, len(Title) - charindex('_', reverse(Title) + '_')) as Title, 
    Value
  from Test
)

select cte.Title, MAX(cte.value)
from cte
group by cte.Title

现在,要准确拍摄第三个下划线,请创建下面文章中指示的函数,然后应用以下查询以获得所需的结果。将凌乱的逻辑内联有点反直觉,所以使用这样的函数是一种方法。 http://www.sqlservercentral.com/scripts/Miscellaneous/30497

使用上面链接中的 Sql Server 函数进行查询:

;with cte as (
  select 
    LEFT(Title, dbo.CHARINDEX2('_', Title, 3) - 1) as Title, 
    Value
  from Test
)

select cte.Title, MAX(cte.value)
from cte
group by cte.Title

祝你好运!


推荐阅读