У меня есть две большие таблицы, и мне нужно увидеть изменение чисел в нескольких строках - PullRequest
0 голосов
/ 11 декабря 2018

РЕДАКТИРОВАТЬ: мне нужно добавить контекст.Ниже приведен небольшой пример таблицы.Я использую 200 столбцов в 30000 строк.

Я в Excel и Access.Я довольно хорошо разбираюсь в Excel, но не очень хорошо разбираюсь в Access.

У меня есть две очень большие аварийные таблицы Excel, таблицы которых соответствуют критериям в нескольких строках.Я хотел бы вернуть изменение сумм между двумя таблицами для каждого столбца, сопоставив три критерия.Смотрите картинку ниже.

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

table example

Какой мой лучший вариант?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Вам просто нужно join объединить таблицы и обработать «пропущенные» значения.Предполагая, что - действительно означает NULL, вы можете сделать:

select t1.[group], t1.pu, t1.currency,
       nz(t1.[8345], 0) - nz(t2.[8345], 0) as diff_8345,
       nz(t1.[6789], 0) - nz(t2.[6789], 0) as diff_6789,
       nz(t1.[4589], 0) - nz(t2.[4589], 0) as diff_4589
from table1 as t1 inner join
     table2 as t2
     on t1.[group] = t2.[group] and
        t1.pu = t2.pu and
        t1.currency = t2.currency;
0 голосов
/ 12 декабря 2018

В sql «группа» является зарезервированным словом, поэтому измените имя поля «группа» на «igroup».

Попробуйте,

Dim Ws As Worksheet
Dim strSQL As String
Dim Rs As Object
Sub test()
    Dim vR As Variant
    Dim str As String
    Dim i As Long
    str = "Select [igroup], iif(isnull([8345]),0,[8345] ), " & _
          "iif(isnull([6789]), 0,[6789] ),  " & _
          "iif(isnull([4589]), 0,[4589] )  " & _
          "from [Table2$] "

    getRs str
    vR = Rs.getrows
    Rs.Close
    Set Rs = Nothing

    For i = LBound(vR, 2) To UBound(vR, 2)
        str = "Update [Table1$] "
        str = str & "set [8345] =  iif(isnull([8345]),0,[8345] ) - " & vR(1, i) & ", "
        str = str & "[6789] = iif(isnull([6789]), 0,[6789] ) - " & vR(2, i) & ", "
        str = str & "[4589] = iif(isnull([4589]), 0,[4589] ) - " & vR(3, i) & " "
        str = str & " Where [igroup] ='" & vR(0, i) & "' "
        getRs str
    Next i

End Sub

Sub getRs(strQuery As String)
    Dim strConn As String
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=Excel 12.0;"

    Set Rs = CreateObject("ADODB.Recordset")
    Rs.Open strQuery, strConn

End Sub
0 голосов
/ 11 декабря 2018

Надеюсь, я здесь не делал никаких опечаток, но идея в том, что вы хотите выполнить FULL OUTER JOIN, чтобы не потерять данные ни из одной таблицы.тогда вам просто нужно вычесть одно значение из другого, указав в предложении «ON», как объединить две таблицы.Поскольку некоторые данные могут иметь информацию из Таблицы 2, а не из Таблицы1, я проверил, нашел ли он что-нибудь, если нет, я извлек из второй таблицы.

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

SELECT
    IIF(ISNULL(T1.[group]), T2.[group], T1.[group]) AS [group],
    IIF(ISNULL(T1.[PU]), T2.[PU], T1.[PU]) AS [PU],
    IIF(ISNULL(T1.[currency]), T2.[currency], T1.[currency]) AS [currency],
    IIF(ISNULL(T2.[8345]), 0, T2.[8345]) - IIF(ISNULL(T1.[8345]), 0, T1.[8345]) AS [8345],
    IIF(ISNULL(T2.[6789]), 0, T2.[6789]) - IIF(ISNULL(T1.[6789]), 0, T1.[6789]) AS [6789],
    IIF(ISNULL(T2.[4589]), 0, T2.[4589]) - IIF(ISNULL(T1.[4589]), 0, T1.[4589]) AS [4589]
    FROM Table1 T1
    FULL OUTER JOIN TABLE2 T2
    ON T1.[group] = T2.[group]
    AND T1.[PU] = T2.[PU]
    AND T1.[currency] = T2.[currency]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...