Gustav Brock
Gustav at cactus.dk
Thu May 1 06:05:42 CDT 2008
Hi Andy
That's right, I didn't read carefully, sorry.
However, to look up a series of values is just as simple as looking up just one, using a filtered Cartesian (multiplying) join:
SELECT
tblValuesToLookup.Id,
tblValuesToLookup.Var,
tblLookup.Result1,
tblLookup.Result2
FROM
tblLookup,
tblValuesToLookup
WHERE
(((Val(Nz((Select Max(RangeEnd) From tblLookup As tbl Where tbl.RangeEnd < tblLookup.RangeEnd),0)))<=[Var])
AND
((tblLookup.RangeEnd)>[Var]));
will return:
Id Var Result1 Result2
1 7 1500 1700
2 17 2000 2500
3 27 2350 2900
4 13 1500 1700
Note the difference from your sample ...
/gustav
>>> andy at minstersystems.co.uk 01-05-2008 10:57 >>>
Hi Gustav. Thanks for this but if I understand this right it's designed to
return just one value based on an input value passed in as a parameter. My
fault entirely if my original question wasn't clear but I need a query which
returns the correct lookup value for all records in my Table1. So if my
input is, say,
7
17
27
13
My output would be
7 1500 1700
17 2000 2500
27 2350 2900
13 2000 2500
Sorry if I misled you by over-simplifying my question.
-- Andy Lacey
http://www.minstersystems.co.uk
>-----Original Message-----
>From: accessd-bounces at databaseadvisors.com
>[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav Brock
>Sent: 01 May 2008 08:43
>To: accessd at databaseadvisors.com
>Subject: Re: [AccessD] Query Question
>
>
>Hi Andy
>
>This can be done returning all fields with one subquery only.
>
>Given tblLookup like:
>
>RangeEnd Result1 Result2
>15 1500 1700
>25 2000 2500
>100 2350 2900
>
>the query could be build this way:
>
> PARAMETERS
> Var Long;
> SELECT
> Val(Nz((Select Max(RangeEnd) From tblLookup As tbl
> Where tbl.RangeEnd < tblLookup.RangeEnd),0)) AS
> RangeMin,
> tblLookup.RangeEnd AS
> RangeMax,
> Result1,
> Result2
> FROM
> tblLookup
> WHERE
> (((Val(Nz((Select Max(RangeEnd) From tblLookup As tbl
>Where tbl.RangeEnd < tblLookup.RangeEnd),0)))<=[Var])
> AND
> ((tblLookup.RangeEnd)>[Var]));
>
>Note that you will only have to specify the max. range (the
>min. is implicit). For this case it means that you must deal
>with a limited upper value, here 100. For an "unlimited" upper
>limit, insert some much higher value.
>
>/gustav
>
>>>> andy at minstersystems.co.uk 30-04-2008 17:30 >>>
>Hi folks
>Looking for best solution to a simple problem. It's of the "if
>var is anything between x and y return this value, if anywhere
>between xx and yy return that etc". I'll express it in its
>most basic form:
>
>Table LKUP has fields
>[RangeStart], [RangeEnd], [Result1], [Result2] and looks like this
>
>0 14.9 1500 1700
>15 24.9 2000 2500
>25 99.9 2350 2900
>
>([RangeEnd] is probably superfluous but I hope it makes the
>example clearer)
>
>Table1 has (among others) field [LookupValue]
>
>I want a query which if [LookupValue] on Table1 is anywhere
>between 0 and 14.9 returns 1500 and 1700 from Lkup, if it's
>between 15 and 24.9 returns 2000 and 2500, and anything from
>25 upwards returns 2350 and 2900.
>
>My solution is this:
>SELECT Table1.[LookupValue],Max([Lkup].Result1)
>,Max([Lkup].Result2) FROM Table1 LEFT JOIN [Lkup] ON
>Table1.[LookupValue] >= [Lkup].[RangeStart] GROUP BY
>Table1.[LookupValue];
>
>Seems to work but because it uses Max it depends on the values
>in Result1 and Result2 getting larger as the lookups get
>larger. If they didn't then the Max would return the wrong
>results (I think).
>
>Any other, or better, ideas?
>
>--
>Andy Lacey
>http://www.minstersystems.co.uk