Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #1
Добавлено: 02.05.05 22:50
У тебя этот трюк пройдёт только, если вместо a,c укажешь статистическую функцию по этим полям, например SELECT b, MAX(a), 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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #6
Добавлено: 04.05.05 18:51
Спасибо большое UU и HOOLIGAN, есть о чём поразмыслить. А пока вот что на Excel-VBA я сделал. Работает всё как надо..
Private Sub GroupBy()
    'Объявление переменных
    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

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам