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
→ Ссылка
- MS Jet в упор не понимает
SELECT .. LIMIT ..
Он привык к
SELECT TOP ...
- Параметр
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