2013-03-02 25 views
2

我有一个由Room_Widths和​​组成的房间数据库。我希望能够在Delphi中使用TADOQuery对数据集进行排序,这样具有最长边的房间,无论是宽度还是长度,都将在数据集中处于第一位。我需要这个,以便稍后可以对它执行装箱算法。如何将数据集按行中更大的2列进行排序?

我希望有一些东西将会看起来非常类似于这样:

ADORoomQuery.SQL.Add('ORDER BY GREATEST(Room_Width, Room_Length)'); 

例如,如果我有3个房间(9×9米),(10×2M)和(5×12m)的:

Room_Widths Room_Lengths 
------------- ------------- 
9    9 
10    2 
5    12 

然后将返回以下数据集:

Room_Widths Room_Lengths 
------------- ------------- 
5    12 
10    2 
9    9 

我使用的MS Access数据库。

+1

您使用的是哪个数据库?你能[编辑你的问题](http://stackoverflow.com/posts/15175716/edit)并包含这些信息吗?谢谢,欢迎来到StackOverflow! – TLama 2013-03-02 14:50:05

+1

哦,谢谢我新的有一些东西我忘了,如果你需要任何更多的信息只是问:) – JabbaWook 2013-03-02 14:56:48

+0

我扩大了你的例子,所以使它有点清洁... – TLama 2013-03-02 15:15:58

回答

3

也许是这样的:

select 
    room_widths, 
    room_lengths, 
    iif(room_widths>room_lengths, room_widths, room_lengths) as longest 
    from 
    yourtable 
    where 
    <your select criteria> 
    order by 
    3 desc 
+0

'3 by order'做什么?即时通讯仍然学习一些的SQL和数据库的东西,所以对不起,我这是一个明显的问题 – JabbaWook 2013-03-02 15:05:54

+0

排序第3列,但你也可以做“按时间排序”,你补充说你使用Access,我敢肯定他们有一个if ,但你必须检查它们是如何实现的。 – 2013-03-02 15:06:53

+0

@ user582118。 。 。我认为在Access中正确的功能是'if'而不是'if'。 – 2013-03-02 15:12:13

1

你可以尝试先正常化您的数据。例如:

select 
    RoomID 
, 'W' as Dimension 
, Room_Widths as DimensionValue 
from yourtable 
union all 
select 
    RoomID 
, 'L' as Dimension 
, Room_Lengths as DimensionValue 
from yourtable 
order by RoomID 

假设您将上述查询保存为NormalisedRooms。这应该给你这样的:

RoomID Dimension DimensionValue 
------ --------- -------------- 
    1   W    9 
    1   L    9 
    2   W    10 
    2   L    2 
    ...  ...    ... 

现在你可以这样做:

select 
    RoomID 
, max(DimensionValue) as LongestSide 
from NormalisedRooms 
group by RoomID 
order by 2 desc 

这应该给你:

RoomID LongestSide 
------ ----------- 
    3   12 
    2   10 
    1   9 
+0

哦,这是我的备份方法,我正在测试以查看是否存在一种直接使用SQL的方式,谢谢你,但如果我确实回到这种方法,这将派上用场。 – JabbaWook 2013-03-03 13:09:43

1

好的,谢谢你的建议。我最终使用@Tlama @GordanLinof @ user582118建议以已经排序的状态返回数据集。

Delphi的语法和SQL我使用的是:

with ADOLayoutQuery do 
    begin 
    SQL.Clear; 
    SQL.Add('SELECT Room_Width,Room_Length,IIF(Room_Width > Room_Length, Room_Width, Room_Length) AS Longest'); 
    SQL.Add('FROM RoomDetails'); 
    SQL.Add('WHERE OrderNumber = ' + inttostr(OrderNum)); 
    SQL.Add('ORDER BY IIF(Room_Width > Room_Length, Room_Width, Room_Length) DESC, (Room_Width + Room_Length) DESC'); 
    Open; 
    end; 

你们也许能够稍稍凝聚这一点,但这个很适合我。再次感谢您的帮助,我期待着提出我的下一个问题

相关问题