如何编写sql命令?

时间:2011-07-15 08:18:42

标签: sql

表一:

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他们。

2 个答案:

答案 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拆分并转换为整数。

在所有情况下,您可能想重新考虑一下这个数据模型是否真的按您希望/需要的方式设置