Доступ к справке для динамического определения изменений записей в разных полях - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть база данных MS Access с таблицей, подобной приведенной ниже, и я пытаюсь выяснить sql, необходимый для определения общего числа раз, когда дата изменяется во всех полях для каждой записи дефекта.

также обратите внимание, что каждый день я добавляю поле в таблицу, поэтому, если это можно сделать динамическим, это будет лучше.

когда нет дат, я хотел бы, чтобы результат отображал 0 (ноль)

alt text

спасибо всем

Ответы [ 3 ]

1 голос
/ 30 декабря 2010

у вас определенно есть проблема с нормализацией.

вам следует подумать о переносе даты в другую таблицу - возможно, похожую на следующую:

Retest Estimate
-----------------
defect_id
estimate_date
ready_date
1 голос
/ 30 декабря 2010

Вы рассматриваете базу данных как электронную таблицу. Было бы лучше настроить таблицу по следующим строкам:

DefectID
TestDate
Est_ReadyForRetest

Это означает, что вы добавляете записи каждый день, а не поля. Это также упростит запросы.

0 голосов
/ 03 января 2011

Я согласен с предположением, что данные должны быть нормализованы, но тогда у вас есть другая проблема для ответа на вопрос, одна из которых я не уверен, как вы это сделаете в SQL (так как он основан на порядок записей). То есть вам нужно пройти набор записей, чтобы сделать это. Я предполагаю, что коррелированный подзапрос мог бы добиться цели, но он должен был бы основываться на том, что можно заказать.

Мои навыки работы с SQL не невероятны, поэтому в резюме я не буду предлагать решение SQL, но, возможно, кто-то еще предложит.

Вместо этого я предложу функцию, которая могла бы вернуть ответ в исходной ненормализованной структуре данных. Я основываю это на своей существующей функции iMax (), которая выглядит следующим образом:

  Public Function iMax(ParamArray p()) As Variant
  ' Idea from Trevor Best in Usenet MessageID 
  '   rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
    Dim i As Long
    Dim lngUBound As Long
    Dim v As Variant

    v = p(LBound(p))
    lngUBound = UBound(p)
    For i = LBound(p) + 1 To lngUBound
      If v < p(i) Then
         v = p(i)
      End If
    Next
    iMax = v
  End Function

Идея заключается в использовании массива параметров для передачи значений в функцию, а затем в обход массива для получения необходимой информации. В этом случае вам нужно пройтись по массиву и посчитать, сколько раз он изменяется, примерно так:

  Public Function CountChange(ParamArray varInput()) As Long
    Dim varValue As Variant
    Dim varPrevious As Variant
    Dim lngCount As Long

    varPrevious = varInput(0)
    For Each varValue In varInput()
      If varValue <> varPrevious Then
         lngCount = lngCount + 1
      End If
      varPrevious = varValue
    Next varValue
    CountChange = lngCount
  End Function

Я не очень тщательно проверял это, и он вообще не имеет отношения к Nulls, но в этом-то и заключается идея - это очень полезная концепция для сравнения данных из полей в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...