SQL ms excel работа с ORDER BY RAND() LIMIT 1

Я хочу получить случайные строки по определенному условию. Есть колонки сотр, идент, алф, дата. У всех тип строка, кроме даты(дата). Получить необходимо по каждому сотр строки, где алф = а в количестве 5%(не менее 15 и не более 25) от общего количества строк по группировке(сотр,алф).

Пишет ошибку "Ошибка синтаксиса (пропущен оператор) в выражении запроса 'RAND() LIMIT ...'"

SELECT [сотр] as emp,*
FROM [Лист1$A2:P]
WHERE [алф] = 'а'
GROUP BY [сотр],[идент]
ORDER BY RAND()
LIMIT IIF(
          ((SELECT COUNT(*) FROM [Лист1$A2:P] WHERE [алф] = 'а' AND [сотр] = emp) * 0.05) < 15,15,
             IIF(
                 ((SELECT COUNT(*) FROM [Лист1$A2:P] WHERE [алф] = 'а' AND [сотр] = emp) * 0.05) > 25,25,
                  (SELECT COUNT(*) FROM [Лист1$A2:P] WHERE [алф] = 'а' AND [сотр] = emp) * 0.05
                 )
         )

Подключение в VBA

Public Function Connect(ByVal sPath As String)
Set cn = CreateObject("ADODB.Connection")
   Select Case CLng(Split(Application.Version, ".")(0))
   Case Is <12
      sCon = "Provider-Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath _
      & ";Extended Properties =""Excel 8.0; HDR=YES;IMEX=1"";"
   Case IS >=12
      sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath _
      & ";Extended Properties = ""Excel 12.0; HDR=YES;IMEX=1"";"
   End Select
cn.Open sCon
End Function

Sub Go()
*****
Set rs = CreateObject("ADODB.Recordset")
  Connect (Thisworkbook.Path & "\" & Thisworkbook.Name)
  Set rs = cn.Execute(SQLQuery)
***
End Sub

SQLQuery - сам запрос, который выше.


Ответы (1 шт):

Автор решения: Akina
  1. MS Jet в упор не понимает
SELECT .. LIMIT ..

Он привык к

SELECT TOP ...
  1. Параметр TOP N должен быть литералом, а не выражением.

Итого: первым запросом получайте количество нужных записей, вставляйте полученное число во второй запрос, и выполняйте его.

Public Function Connect(sPath As String)
Set cn = CreateObject("ADODB.Connection")
   Select Case CLng(Split(Application.Version, ".")(0))
   Case Is <12
      sCon = "Provider-Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath _
      & ";Extended Properties =""Excel 8.0; HDR=YES;IMEX=1"";"
   Case IS >=12
      sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath _
      & ";Extended Properties = ""Excel 12.0; HDR=YES;IMEX=1"";"
   End Select
cn.Open sCon
End Function
Sub Main()
Set rs = CreateObject("ADODB.Recordset")
  ' *** '
  Connect Thisworkbook.FullName
  SQLQuery = "запрос для получения количества записей"
  Set rs = cn.Execute(SQLQuery)
  rs.movefirst
  cnt = rs!cnt
  rs.close
  SQLQuery = "SELECT TOP " & cnt & " хвост запроса на получение данных"
  Set rs = cn.Execute(SQLQuery)
  rs.movefirst
  ' *** '
End Sub
→ Ссылка