2

我有一个由Room_Widths和组成的房间数据库Room_lengths。我希望能够TADOQuery在 Delphi 中使用 a 对数据集进行排序,以便具有最长边的房间,无论是宽度还是长度,都将在数据集中排在第一位。我需要这个,以便以后可以对其执行装箱算法。

我希望,有些东西看起来与此非常相似:

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

例如,如果我有 3 个房间(9 x 9m)、(10 x 2m)和(5 x 12m):

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

然后它将返回以下数据集:

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

我正在使用 MS Access 数据库。

4

3 回答 3

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
于 2013-03-02T15:01:57.790 回答
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;

你们也许可以稍微浓缩一下,但这对我有用。再次感谢您的帮助,我期待着问我的下一个问题

于 2013-03-03T16:59:51.083 回答
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
于 2013-03-02T20:27:58.060 回答