field one field two
1 1-1
2 1-2
3 1-5
4 1-3
4 1-6
4 1-2
5 1-0
使用sql命令获取结果如下表所示。
field one field two
5 1-0
1 1-1
2 1-2
4 1-2
4 1-3
4 1-6
3 1-5
ps:条件是按asc选择两个字段。但是如果结果具有相同的字段,则将字段二放在一起。并且asc他们。
答案 0 :(得分:2)
关于你的第二个问题(实际上也正确排序),它会变得有点复杂。 此版本适用于Sql-Server(不知道您使用的是什么,功能可能不同)
select tableOne.fieldOne, tableOne.fieldTwo
from tableOne
inner join
(select
fieldOne,
MIN(Convert(int, LEFT(tableOne.FieldTwo, CHARINDEX('-', tableOne.fieldTwo)-1))) as LeftPartMin,
MIN(Convert(int, SubString(tableOne.FieldTwo, CHARINDEX('-', tableOne.fieldTwo)+1, 100))) as RightPartMin
from tableOne group by fieldOne
) b
on (b.fieldOne = tableOne.fieldOne)
order by b.LeftPartMin, b.RightPartMin, fieldOne, Convert(int, LEFT(tableOne.FieldTwo, CHARINDEX('-', tableOne.fieldTwo)-1)), Convert(int, SubString(tableOne.FieldTwo, CHARINDEX('-', tableOne.fieldTwo)+1, 100))
您可以通过在表格末尾添加以下2条记录来测试: 4 1-20 2 1-10
这也揭示了第一个解决方案中的错误:您还需要对一个fieldOne进行排序! (作为第二个排序参数),以确保具有相同fieldOne的组最终在一起(编辑其他答案以纠正此问题)
答案 1 :(得分:1)
没有检查语法,但这些内容应该这样做:
select tableOne.fieldOne, tableOne.fieldTwo, b.SortField from tableOne
inner join
(select fieldOne, min(fieldTwo) as SortField from tableOne group by fieldOne) b
on (b.fieldOne = tableOne.fieldOne)
order by b.SortField, tableOne.fieldOne, tableOne.fieldTwo
实质上:对于每个fieldOne,找到组中的最低值,并将其用作组中所有记录的主要排序字段。在组内对fieldtwo
中的实际值进行排序仍然存在潜在的问题:1-10将在1-1和1-2之间排序 如果您还想解决这个问题,则需要将fieldtwo拆分并转换为整数。
在所有情况下,您可能想重新考虑一下这个数据模型是否真的按您希望/需要的方式设置