我有一个由Room_Widths
和Room_lengths
组成的房间数据库。我希望能够使用Delphi中的TADOQuery
对数据集进行排序,以便具有最长边的房间,无论是宽度还是长度,都将是数据集中的第一个。我需要这个,以便我可以在以后执行bin打包算法。
我希望,有些东西看起来与此相似:
ADORoomQuery.SQL.Add('ORDER BY GREATEST(Room_Width, Room_Length)');
例如,如果我有3个房间(9 x 9米),(10 x 2米)和(5 x 12米):
Room_Widths Room_Lengths
------------- -------------
9 9
10 2
5 12
然后它将返回以下数据集:
Room_Widths Room_Lengths
------------- -------------
5 12
10 2
9 9
我正在使用MS Access数据库。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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;
你们可能会稍微压缩一下,但这对我有用。再次感谢您的帮助,我期待着提出我的下一个问题