Запрос создания идентификатора для каждого пакета - PullRequest
1 голос
/ 10 февраля 2012

Извините, название не очень наглядное, но это сложная проблема для слова.

У меня есть некоторые данные, около 200 или более строк, и у каждой строки есть PacketID, поэтому несколько строк принадлежат одному пакету. Что мне нужно сделать, так это преобразовать все PacketID из (Пример - BDFD-2) в просто число (Пример - 1), поэтому все записи с идентификатором пакета x должны иметь идентификатор пакета, скажем 3. Есть ли SQL-запрос, который может сделать это? Или мне просто нужно пройти вручную.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Вы спрашивали о запросе.Я написал быструю процедуру VBA вместо этого просто потому, что это было так просто.Но я не уверен, подходит ли это для вашей ситуации.

Я создал tblPackets с числовым столбцом для new_PacketID.Я надеялся, что станет понятнее, что происходит.Если вам действительно необходимо заменить PacketID новым номером, вы можете изменить процедуру, чтобы сохранить CStr(lngPacketID) в этом текстовом поле.Итак, это пример данных, с которого я начал:

PacketID new_PacketID packet_data
BDFD-2                a
R2D2-22               aa
BDFD-2                b
R2D2-22               bb
EMC2-0                aaa
EMC2-0                bbb

И это таблица после выполнения процедуры.

PacketID new_PacketID packet_data
BDFD-2              1 a
R2D2-22             3 aa
BDFD-2              1 b
R2D2-22             3 bb
EMC2-0              2 aaa
EMC2-0              2 bbb

И код ...

Public Sub RenumberPacketIDs()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim lngPacketID As Long
    Dim strLastPacketID As String
    Dim strSql As String

    strSql = "SELECT PacketID, new_PacketID" & vbCrLf & _
        "FROM tblPackets" & vbCrLf & _
        "ORDER BY PacketID;"
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSql)

    With rs
        Do While Not .EOF
            If !PacketID <> strLastPacketID Then
                lngPacketID = lngPacketID + 1
                strLastPacketID = !PacketID
            End If
            .Edit
            !new_PacketID = lngPacketID
            .Update
            .MoveNext
        Loop
        .Close
    End With

    Set rs = Nothing
    Set db = Nothing
End Sub

Я думаю, что подобный подход может быть подходящим для одноразового преобразования.Однако, если это операция, которую вам нужно выполнять повторно, это может быть более сложным ... особенно если вам нужно, чтобы каждый PacketID заменялся на один и тот же номер от одного запуска к следующему ... напримерBDFD-2 был заменен на 1 в первый раз, поэтому должен заменяться на 1 при каждом запуске процедуры.

0 голосов
/ 10 февраля 2012

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

SELECT DISTINCT TableOfRows.Packet_id AS PacketId INTO Packets FROM TableOfRows;

Затем вы можете использовать ее, чтобы выбрать интересующий вас пакет и отобразить соответствующие строки

0 голосов
/ 10 февраля 2012

Если у вас есть только несколько идентификаторов пакетов, вы можете просто использовать обновление:

UPDATE table_name
   SET PacketID = 
       (
           CASE PacketID
               WHEN 'BDFD-2' THEN 3
               WHEN 'ABCD-1' THEN 5
               ELSE 2
           END
       )

ELSE является необязательным.

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