Страница: 1 |
Страница: 1 |
Вопрос: Ещё раз SQL немогу
Добавлено: 02.05.05 20:46
Автор вопроса: Aston
Написал в запросе
Data1.RecordSource = "SELECT b,a,c From Таблица1 GROUP BY b"
Мне выдаёт ошибку:
Попытка выполнить запрос, который не включает указанное выражение как часть статистической функции или группы.
Возможная причина:
· Статистическая функция не была указана в инструкции TRANSFORM.
Что за TRANSFORM и чё надо делать, обьясните где я неправ.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 02.05.05 22:50
У тебя этот трюк пройдёт только, если вместо a,c укажешь статистическую функцию по этим полям, например SELECT b, MAX, SUM(b) FROM Таблица1 GROUP BY b
Сам подумай, что за значение a,c комп должен выдавать для каждых совпадающих b?
b a c
Петров 6 1
Петров 4 2
Петров 7 9
Иванов 8 1
Иванов 6 3
Просто ты должен вложить какой-то смысл в a,c иначе зачем тебе их выводить?
Номер ответа: 2
Автор ответа:
Kveller
Вопросов: 5
Ответов: 5
Профиль | | #2
Добавлено: 03.05.05 12:59
mc-black правильно говорить, надо исрользовать агрегатные функции, или в гроуп бай-е указать все поля начиная от того поля который тебе нужен.
Номер ответа: 3
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #3
Добавлено: 03.05.05 19:13
Встречный вопрос у меня ко всем, кстати по теме В общем, есть одномерный массив строк, одно поле БД, как хотите (на самом деле у меня столбец в Excel). Подскажите без SQL сам алгоритм Group By по аналогии с SELECT a FROM table GROUP BY a.
Какой алгоритм быстрее всего сработает с неотсортированным массивом строк? Сортировка не требуется, но и не вредит, если она будет.
Я предлагаю так: Последовательно в один проход иду по большому массиву с данными. Имею динамический массив (можно коллекцию) для результатов. На каждом шаге проверяю весь итоговый массив на совпадение с текущим элементом массива с данными. Если не выявлено ни одного совпадения, добавляю элемент массива с данными в массив с результатами и двигаюсь дальше. Если есть совпадение - просто перехожу к слудующему элементу. По окончании (если надо, да это и не требуется) сортирую итоговый массив по возрастанию/убыванию - так меньше сортировки.
Кто-то может предложить мне что-то более оптимальное?
Номер ответа: 4
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #4
Добавлено: 03.05.05 19:45
Это ты описал bubblesort насколько я понял...
Алгоритм следующий:
Bubblesort (A[n]
for i := 1 to n - 1
do for j := 1 to n - i
do if A[j] > A[j+1]
then temp := A[j]
A[j] := A[j + 1]
A[j + 1 ] := temp
На VB выглядит так:
Public Function BubbleSortArray(ByVal NumericArray As Variant) As Variant
'RETURNS Array, or vbEmpty if there's an error
'e.g., passed array contains elements that
'can't be compared to each other, such as
'objects
'will work when elements are all numbers or single characters
'of the same case.
Dim vAns As Variant
Dim vTemp As Variant
Dim bSorted As Boolean
Dim lCtr As Long
Dim lCount As Long
Dim lStart As Long
Dim lPass as long
vAns = NumericArray
If Not IsArray(vAns) Then
BubbleSortArray = vbEmpty
Exit Function
End If
On Error GoTo ErrorHandler
lStart = LBound(vAns)
lCount = UBound(vAns)
lPass=0
bSorted = False
Do While Not bSorted
bSorted = True
For lCtr = lCount - 1 To lStart + lPass Step -1
If vAns(lCtr + 1) < vAns(lCtr) Then
DoEvents
bSorted = False
vTemp = vAns(lCtr)
vAns(lCtr) = vAns(lCtr + 1)
vAns(lCtr + 1) = vTemp
End If
Next lCtr
lPass = lPass + 1
Loop
BubbleSortArray = vAns
Exit Function
ErrorHandler:
BubbleSortArray = vbEmpty
Exit Function
End Function
'Спёрто с freevbcode
Номер ответа: 5
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #5
Добавлено: 03.05.05 20:29
Два совета:
1. Проверять не только на совпадение строки в итоговом массиве, но и на предмет "больше-меньше".
2. Новую строку не добавлять в итоговый массив, а вставлять в середину, перед первой строкой, которая больше сравниваемой.
Эти два момента позволят сократить количество сравнений и получить сразу сортированный итоговый массив строк.
Можно несколько усложнив алгоритм и уйдя от последовательного сравнения строк, ещё ускорить поиск наличия строки в итоговом массиве.
Сравнить со средним элементом - если строка образец больше - пропустить проверку первой половины массива и искать во второй (элементы ведь сортированы, значит в первой половине такой строки нет) и затем можно ещё раз оставшуюся половину таким же образом поделить на две части и т.д.
Номер ответа: 6
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #6
Добавлено: 04.05.05 18:51
Спасибо большое UU и HOOLIGAN, есть о чём поразмыслить. А пока вот что на Excel-VBA я сделал. Работает всё как надо..
'Объявление переменных
Dim i As Integer
Dim j As Integer
Dim b As Boolean
Dim src As Range
Dim dst As Collection
'Поздняя привязка
Set src = Sheets(1).Range("C6:C13"
Set dst = New Collection
'Цикл по данным для группировки
For i = 1 To src.Count
b = True
'Цикл по сгруппированным данным
For j = 1 To dst.Count
'Проверка на повторы
If src.Cells(i).Value = dst.Item(j) Then
b = False
Exit For
End If
Next j
'Добавление новых групп
If b Then dst.Add (src.Cells(i).Value)
Next i
'Вывод результата из коллекции
For i = 1 To dst.Count
Debug.Print dst.Item(i)
Next i
'Очистка мусора
Set dst = Nothing
Set src = Nothing
End Sub