我希望我的查询返回列中包含特定值的表中的行。在我获得组中订购的行后,我希望能够按名称对它们进行排序。
示例表
- 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组
答案 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_6
或Group_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 |