2015-09-28 5 views
0

У меня есть таблица данных, которая имеет годовые точки данных и квартальные точки данных. Я хочу вычесть квартальные точки данных из соответствующей предыдущей ежегодной записи, например. Годовой 2014 - Q3 2014, используя t-SQL. У меня есть переменная id для каждой записи, плюс переменная id примитива, которая показывает, какая ежеквартальная запись соответствует той годовой записи. Смотрите ниже:Вычесть несоответствующие значения в одной строке в t-SQL

CurrentDate PreviousDate Value Entry Id Reconcile Id Annual/Quarterly 
9/30/2012 9/30/2011 112  2   3    Annual 
9/30/2013 9/30/2012 123  1   2    Annual 
9/30/2014 9/30/2013 123.5 9   1    Annual 
12/31/2013 9/30/2014 124  4   1   Quarterly 
3/31/2014 12/31/2013 124.5 5   1   Quarterly 
6/30/2014 3/31/2014 125  6   1   Quarterly 
9/30/2014 6/30/2014 125.5 7   1   Quarterly 
12/31/2014 9/30/2014 126  10   9   Quarterly 
3/31/2015 12/31/2014 126.5 11   9   Quarterly 
6/30/2015 3/31/2015 127  12   9   Quarterly 

Например, сверка ID 9 для ежеквартальных записей соответствует Входу ID 9, который является ежегодной записью.

У меня есть код, чтобы просто вычесть предыдущую запись из текущей записи, но я не могу понять, как вычитать квартальные записи из годовых записей, в которых идентификатор Entry и Reconcile ID совпадают.

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

SELECT DISTINCT T1.[EntryID] 
    , [T1].[RECONCILEID] 
    , [T1].[CurrentDate] 
    , [T1].[Annual_Quarterly] 
    , [T1].[Value] 
    , [T1].[Value]-T2.[Value] AS Difference 
    FROM Table T1 
    LEFT JOIN Table T2 ON T2.EntryID = T1.RECONCILEID; 
+1

Можете ли вы привести пример того, что вы» в попытке получить результат? – Siyual

+0

Это легко сделать с помощью самостоятельного объединения или коррелированного подзапроса. Google - один или оба для примера. –

+0

Я что-то упустил или группируюсь по всем полям? Не было бы проще использовать «выбрать отличный»? –

ответ

0

Ваш код должен быть хорошо, вот результаты я получаю:

EntryId Annual_Quarterly CurrentDate ReconcileId Value recVal diff 
2  Annual    9/30/2012 3   112  
1  Annual    9/30/2013 2   123  112  11 
9  Annual    9/30/2014 1   123.5 123  0.5 
4  Quarterly   12/31/2013 1   124  123  1 
5  Quarterly   3/31/2014 1   124.5 123  1.5 
6  Quarterly   6/30/2014 1   125  123  2 
7  Quarterly   9/30/2014 1   125.5 123  2.5 
10  Quarterly   12/31/2014 9   126  123.5 2.5 
11  Quarterly   3/31/2015 9   126.5 123.5 3 
12  Quarterly   6/30/2015 9   127  123.5 3.5 

с вашими данными и это SQL:

SELECT 
    tr.EntryId, 
    tr.Annual_Quarterly, 
    tr.CurrentDate, 
    tr.ReconcileId, 
    tr.Value, 
    te.Value AS recVal, 
    tr.[VALUE]-te.[VALUE] AS diff 
FROM 
    t AS tr LEFT JOIN 
    t AS te  ON 
    tr.ReconcileId = te.EntryId 
ORDER BY 
    tr.Annual_Quarterly, 
    tr.CurrentDate; 
+0

, который сработал! Благодаря! – Jacob

0

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

Select  T1.*, T1.Value - Coalesce(T2.Value, 0) As Difference 
From  Table T1 
Left Join Table T2 On T2.[Entry Id] = T1.[Reconcile Id] 
+0

Спасибо, Siyual. Это не совсем то, что я ищу. Более подробная информация приведена в примере: я хочу вычесть каждое значение с идентификатором Reconcile ID = 9 из значения, имеющего идентификатор входа = 9, в результате чего для каждого наблюдения будет отображаться переменная разницы. В конце концов, соблюдая этот пример, мы видим, что наблюдение с идентификатором Entry ID = 9 имеет значение 123.5, поэтому я хочу, чтобы столбец разницы просто вычитал 123,5 из каждого значения, где идентификатор Reconcile = 9. – Jacob

+0

@ Якоб, вы можете обновить свой вопрос с ожидаемым результатом, который вы ищете из запроса? – Siyual

+0

@Jacob Я обновил запрос - этот должен дать вам результаты, которые вы ищете. – Siyual