Jerry said:
I was put in SELECT TOP 33.4 PERCENT and return 101 records when sorting on
the primary key.
When I typed in SELECT TOP 33.5 PERCENT the query returned 105 records.
Looks like it does round the percent.
One obvious approach, then, is to spurn the proprietary TOP N syntax,
over which no one has any control, and replace it will standard SQL
syntax tailored to the OP's needs e.g.
SELECT T1.data_col
FROM Test AS T1
WHERE (
SELECT COUNT(*) * 0.3333333333333333333333333
FROM Test AS T3
) >= (
SELECT COUNT(*)
FROM Test AS T2
WHERE T1.data_col >= T2.data_col
);
Here's some VBA to reproduce a demo to return 102 rows from a set of
306 rows using the parameter value 0.3333333333333333333333333:
Sub test306()
Kill "C:\DropMe1.mdb"
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\DropMe1.mdb"
With .ActiveConnection
' Create auxilary table of digits 0-9
.Execute _
"CREATE TABLE Digits (nbr INTEGER NOT NULL" & _
" UNIQUE, CHECK(nbr BETWEEN 0 AND 9));"
.Execute _
"INSERT INTO Digits (nbr) VALUES (0);"
.Execute _
"INSERT INTO Digits (nbr) SELECT DT1.nbr" & _
" FROM (SELECT 1 AS nbr FROM Digits UNION" & _
" ALL SELECT 2 FROM Digits UNION ALL SELECT" & _
" 3 FROM Digits UNION ALL SELECT 4 FROM Digits" & _
" UNION ALL SELECT 5 FROM Digits UNION ALL" & _
" SELECT 6 FROM Digits UNION ALL SELECT 7" & _
" FROM Digits UNION ALL SELECT 8 FROM Digits" & _
" UNION ALL SELECT 9 FROM Digits ) AS DT1"
' Create a test table
.Execute _
"CREATE TABLE Test (data_col INTEGER" & _
" NOT NULL); "
' Insert 306 rows using Digits table
.Execute _
"INSERT INTO Test (data_col) SELECT Units.nbr" & _
" + Tens.nbr + Hundreds.nbr AS data_col FROM" & _
" (SELECT nbr FROM Digits) AS Units, (SELECT" & _
" nbr * 10 AS nbr FROM Digits) AS Tens, (SELECT" & _
" nbr * 100 AS nbr FROM Digits) AS Hundreds" & _
" WHERE Units.nbr + Tens.nbr + Hundreds.nbr" & _
" BETWEEN 1 AND 306;"
' Create test proc with DECIMAL param
.Execute _
"CREATE PROCEDURE TestProc (" & _
" arg_percent DECIMAL(25, 24) = 1) AS" & _
" SELECT COUNT(*) AS row_count" & _
" FROM (SELECT T1.data_col FROM Test AS T1" & _
" WHERE (SELECT COUNT(*) * arg_percent FROM" & _
" Test AS T3) >= (SELECT COUNT(*) FROM Test" & _
" AS T2 WHERE T1.data_col >= T2.data_col))" & _
" AS DT1;"
' Invoke proc
Dim rs
Set rs = .Execute( _
"EXEC TestProc 0.333333333333333333333333;")
MsgBox rs.GetString
rs.Close
End With
Set .ActiveConnection = Nothing
End With
End Sub
Jamie.
--