Повторяющиеся строки на основе количественного значения - PullRequest
0 голосов
/ 27 апреля 2020

Я использую Microsoft Access в качестве платформы для запуска SQL и пытаюсь получить следующие выходные данные на основе запроса:

Например, взять следующую строку:

A | B | C | 3

Из этой строки я хотел бы получить 3 строки, как показано ниже:

A | B | C | 1
A | B | C | 1
A | B | C | 1

"3" - это количество в приведенном выше примере.

Заранее спасибо !

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Если у вас есть отдельная таблица чисел, которая может быть весьма полезна при многих обстоятельствах, вы можете использовать:

select t.a, t.b, t.c, 1
from t inner join
     numbers as n
     on n.n <= t.cnt;

К сожалению, не существует действительно эффективного способа создания такой таблицы в то же самое утверждение SQL. Вы можете создать такую ​​таблицу, используя столбец identity (я не думаю, что MS Access имеет пробелы в столбцах идентификаторов).

0 голосов
/ 27 апреля 2020

Ниже приведено решение VBA, которое открывает набор записей на основе исходной таблицы («tblData»), а затем зацикливает каждую запись столько раз, сколько необходимо, вставляя необходимую информацию во временную таблицу («tblTempData»):


Sub sSplitData()
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Dim rsSteer As DAO.Recordset
    Dim rsData As DAO.Recordset
    Dim lngLoop As Long
    Set db = DBEngine(0)(0)
    Set rsSteer = db.OpenRecordset("SELECT * FROM tblData;")
    If Not (rsSteer.BOF And rsSteer.EOF) Then
        db.Execute "DELETE * FROM tblTempData;"
        Set rsData = db.OpenRecordset("SELECT * FROM tblTempData WHERE 1=2;")
        Do
            For lngLoop = 1 To rsSteer!Quantity
                With rsData
                    .AddNew
                    !Field1 = rsSteer!Field1
                    !Field2 = rsSteer!Field2
                    !Field3 = rsSteer!Field3
                    !Quantity = 1
                    .Update
                End With
            Next lngLoop
            rsSteer.MoveNext
        Loop Until rsSteer.EOF
    End If
sExit:
    On Error Resume Next
    rsData.Close
    rsSteer.Close
    Set rsData = Nothing
    Set rsSteer = Nothing
    Set db = Nothing
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sSplitData", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

С уважением,

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