如何按特定值返回组中的行?

时间:2014-08-15 08:31:21

标签: sql sql-order-by

我希望我的查询返回列中包含特定值的表中的行。在我获得组中订购的行后,我希望能够按名称对它们进行排序。

示例表

 - Id    - Name    - Group       
 - 1       George    Group_2_1
 - 2       Alfred    Group_2_2
 - 3       Eric      Group_3
 - 4       Mary      Group_1_2
 - 5       Jon       Group_1_1

我希望他们按照他们的小组排序,然后按照他们的名字命令

 - Id    - Name    - Group    
 - 1       Jon       Group_1_1
 - 2       Mary      Group_1_2
 - 3       Alfred    Group_2_2   
 - 4       George    Group_2_1
 - 5       Eric      Group_3

我找到了这个SQL-Query-Snippet

ORDER BY CASE WHEN Group LIKE '%Group_1%' THEN 1 ELSE 2 END, Group

但这还不够。结果只按第一组分组(显然),但我无法对其进行扩展以订购第二组,因为它位于同一列中。

请不要对这个例子感到困惑。 我只是希望能够对某些行进行分组并将它们放在结果前面。我想要一个结果,其中所有行包含顶部的组1,中间包含组2,底部包含组3。 这些值不是" Group_1_1"或类似的东西。它们只是一些字符串,我希望某些字符串始终位于第一行(第1组),而某些字符串始终位于第1组

2 个答案:

答案 0 :(得分:1)

这里的问题似乎是你的一些团体名称有一个额外的下划线,否则你可以只是由集团订购,一切都会好。你可能会做这样的事情来解决这个问题吗?

WITH Data AS (
SELECT 'Group1_1' AS Value
UNION 
SELECT 'Group_3_2' AS Value
UNION
SELECT 'Group_2_2' AS Value
UNION
SELECT 'Group_3_1' AS Value
)
SELECT * FROM Data ORDER BY CASE WHEN Value LIKE 'Group_%' THEN SUBSTRING(Value, 7, 10) ELSE SUBSTRING(Value, 6, 10) END;

结果:

Value
Group1_1
Group_2_2
Group_3_1
Group_3_2

----编辑----

好的,看到你的例子并不是一个“例子”,听起来你需要一个真正的,非常长的案例陈述。您可以执行此类操作(使用原始的Group_1_1,Group_2_2代码),这些代码将扩展为不同的值。关键是CASE语句从左到右工作,并将值分配给匹配的第一个案例:

ORDER BY
    CASE
        WHEN [Group] = 'Group_1_1' THEN 1
        WHEN [Group] = 'Group_1_2' THEN 2
        WHEN [Group] LIKE 'Group_1_%' THEN 3
        WHEN [Group] = 'Group_2_1' THEN 4
        WHEN [Group] = 'Group_2_2' THEN 5
        WHEN [Group] LIKE 'Group_2_%' THEN 6
       etc.
    END;

显然,这非常通用,取决于数据库中的实际值。

答案 1 :(得分:0)

编辑mssql

如果存在3个下划线的任何实例,则以下内容将无效。但是,如果有Group_12_6Group_21_1的可能性,那么这种方法可能值得尝试。

它从字符串中删除Group_或Group,留下1_1或12_6或21_1然后用它替换剩余的下划线。给出1.1或12.6或21.1并将其转换为十进制。

完全取决于这些群组名称的一致性。

SELECT
      id
    , name
    , [Group]
FROM YourData
ORDER BY
      CAST(REPLACE(REPLACE(REPLACE([Group], 'Group_', ''), 'Group', ''), '_', '.') AS decimal(12,3))
    , name

我真的希望你没有名为[Group]的列,但如果你这样做,则必须引用[Group]或“Group”。测试结果:

| ID |   NAME |     GROUP |
|----|--------|-----------|
|  1 |    Jon | Group_1_1 |
|  2 |   Mary | Group_1_2 |
|  4 | George | Group_2_1 |
|  3 | Alfred | Group_2_2 |
|  5 |   Eric |   Group_3 |

请参阅http://sqlfiddle.com/#!3/e95b07/1