Рассчитать абсолютную разницу между строками в MsAccess - PullRequest
2 голосов
/ 05 марта 2011

Я потратил все утро на это и просто не могу понять это правильно ... Я бы очень признателен за помощь кого-то более знающего, чем я, чтобы заставить это работать.

У меня есть таблица с некоторыми данными, которая выглядит следующим образом:

MonthYear WeekBeg.  Week  Value  
Dec-10  27/12/2010  1   66.66  
Jan-11  3/01/2011   2   50  
Jan-11  10/01/2011  3   17.5  
Jan-11  17/01/2011  4   20  
Jan-11  24/01/2011  5   0  
Jan-11  31/01/2011  6   50  
Feb-11  7/02/2011   7   0  
Feb-11  14/02/2011  8   74  
Feb-11  21/02/2011  9   100  

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

16,66
32,5
2,5
20
50
50
74
26

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

Я не опубликовал то, чем закончил, потому что все больше и больше попадал в беспорядок, но я начал с ссылки выше. Опять же, я был бы очень благодарен за любые идеи, которые кто-либо может предложить.

Большое спасибо

ДОБАВЛЕНО:

Большое спасибо за быстрый ответ. Получилось легко - добавили несколько битов:

ВЫБРАТЬ T1.MonthYear AS [От], T2.MonthYear AS [До], T1.Week AS Week, T1.WeekBeg AS WeekBeg, ABS (T1.Value - T2.Value) AS Разница ОТ теста КАК T1 СЛЕДУЕТ СОЕДИНИТЬСЯ Тест AS T2 ON T2.Week = T1.Week + 1

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

Еще раз большое спасибо.

ДОБАВЛЕНО:

Определенно стоило бы использовать второй вариант, если это возможно, поскольку не всегда можно гарантировать, что недели не будут пропущены. Возможно, я что-то упустил, но когда я запускаю второй вариант от Томаса, я получаю сообщение:

'Указанное поле [T1]. [Datavalue] может ссылаться на несколько таблиц, перечисленных в предложении FROM вашего оператора SQL'.

Я думал, что это может быть связано с тем, что поле в таблице является VALUE, а не DataValue, но когда я его изменяю, вместо этого я получаю «Несоответствие типов в выражении».

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

Предполагается, что столбец Week является совершенно последовательным:

Select T1.MonthYear As T1Year
    , T1.WeekBeg As T1WeekBeg
    , T2.MonthYear As T2Year
    , T2.WeekBeg As T2WeekBeg
    , [T2].[Value]-[T1].[Value] AS Expr1
From TableWithData AS T1 
    Left Join TableWithData AS T2 
        On T1.Week = T2.Week + 1;

Следует отметить, что он не будет компилироваться в конструкторе QBE.Вам придется просматривать и изменять его исключительно через представление SQL (или в коде)

Если по какой-то причине вы не можете зависеть от того, является ли номер недели последовательным, то он становится сложнее, так как вам нужно использовать производныйТаблица.Опять же, это решение будет работать только в SQL View или в коде:

Select T1.MonthYear, T1.WeekBeg
    , T2.MonthYear, T2.WeekBeg
    , [T2].[Value]-[T1].[Value] AS Diff
From (TableWithData AS T1 
    Inner Join (
            Select T1.WeekBeg As T1WeekBeg
                    , Min(T2.WeekBg) As T2WeekBeg
                From TableWithData As T1 
                    Left Join TableWithData AS T2 
                        On T2.WeekBeg > T1.WeekBeg
                Group By T1.WeekBeg
                ) As Query1
        On T1.WeekBeg = Query1.T1WeekBeg) 
    Inner Join TableWithData AS T2 
        On Query1.T2WeekBeg = T2.WeekBeg;
0 голосов
/ 05 марта 2011

Версия, основанная на примере запроса из вашей базовой ссылки. (Он использует ORDERY BY в поле Week, а TOP 1 также изолирует скалярное значение.)

SELECT  t1.Value - (SELECT TOP 1 t2.Value FROM myTable AS t2 
                               WHERE t2.Week < t1.Week
                               ORDER BY t2.Week DESC) AS t2Val
FROM myTable t1
WHERE (SELECT TOP 1 t3.Value FROM myTable AS t3
       WHERE t1.Week < t3.Week) Is Not Null
ORDER BY t1.Week;

Должно быть близко к работе, но псевдонимы очень подвержены ошибкам. Я полагаю, что если номера недель индексируются последовательно, вы идете с ответом Томаса.

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