Как я могу повторить следующие вычисления Excel в операторах SQL? - PullRequest
0 голосов
/ 29 ноября 2018

Я начинаю со столбцов Week, Prod и Qty:

Initial Dataset

Мне бы хотелось, чтобы мой вывод был следующим:

Desired output

Я использовал следующие формулы Excel для получения этого вывода:

В ячейке D2: =IF(B2=B1, IF(C2=C1, "N", "Y"), "N") В ячейке E2: =IF(D2="N", "NA", C2-C1)

Я хотел бы повторить то же самое в инструкциях SQL.Я не уверен, как я могу начать.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Запрос в Excel напрямую:

Sub TestQuery()

    Dim oConn As New ADODB.Connection
    Dim oRS As ADODB.Recordset
    Dim sPath, t
    Dim sSQL As String, s As String

    sSQL = " select t1.*, t2.qty, IIf(t1.Qty=t2.Qty,'N','Y') as changed,  " & _
           " IIf(t1.Qty=t2.Qty,'NA',t2.qty-t1.qty) as change " & _
           " from [Sheet4$] t1, [Sheet4$] t2 " & _
           " where t1.Prod=t2.Prod and t2.Week = t1.week+1 "

    sPath = ThisWorkbook.Path & "\" & ThisWorkbook.Name

    oConn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
               "DBQ=" & sPath & ";"

    Set oRS = oConn.Execute(sSQL)

    If Not oRS.EOF And Not oRS.BOF Then
        ToSheet Sheet5.Range("A1"), oRS
    Else
        MsgBox "No records found"
    End If

End Sub

Sub ToSheet(rng, rs)
    Dim f, i
    i = 0
    rng.Resize(1000, 200).ClearContents
    For Each f In rs.Fields
        rng.Offset(0, i).Value = f.Name
        i = i + 1
    Next f
    rng.Offset(1, 0).CopyFromRecordset rs
End Sub

Ввод / вывод:

enter image description here

0 голосов
/ 29 ноября 2018

Это в Oracle, но с использованием аналитических функций, которые являются стандартными.Синтаксис может немного отличаться в других продуктах SQL, но синтаксис самих функций должен быть одинаковым.Я также использую выражение case, которое также является стандартным.

select week, prod,
       case when qty != lag(qty) over (partition by prod order by week)
            then 'Y' else 'N' end as week_over_week_change,
       qty - lag(qty) over (partition by prod order by week) as weekly_qty_change
from   [your table, view, or whatever]
........
0 голосов
/ 29 ноября 2018

Я понимаю, что вы пытаетесь сравнить количество каждого данного продукта в течение последовательных недель.В SQL вы можете добиться этого, присоединив таблицу к себе, используя предложение LEFT JOIN (тот же продукт и на следующей неделе).Если совпадения отсутствуют (на следующей неделе нет для данного продукта), предложение join даст значения NULL.Исходя из этого, вы можете затем реализовать логику сравнения.

Вы пометили свой вопрос как oracle и mysql, я не знаю, действительно ли это нарочно, но это решение должно работать для обоих:

select
    t1.week,
    t1.prod,
    t1.qty,
    case 
        when t2.week is null or t1.qty = t2.qty then 'N'
        else 'Y' 
    end week_over_week_change,
    case 
        when t2.week is null or t1.qty = t2.qty then 'NA'
        else t1.qty - t2.qty 
    end week_over_week_change_qty
from table t1
left join table t2 on t2.prod = t2.prod and t2.week = t1.week + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...