Соедините две 2 таблицы, чтобы получить сумму за каждый год - SQL Server - PullRequest
0 голосов
/ 27 августа 2018

У меня есть 2 таблицы ниже. Общий столбец - ObjectId.

Таблица 1 :

    Year  ObjectId G_Amount
   =====  ======== ========-
    2010  1234       5.00
    2010  1234       5.00
    2010  5678      10.00
    2010  5678      20.00
    2010  5678      50.00
    2012  9101       0.00
    2012  1122      70.00
    2012  1122     100.00

Таблица 2 :

    ObjectId   I_Amount
   =========  ===========-
    1234       10.00
    1234       30.00
    5678       15.00
    5678       20.00
    9101       25.00
    9101       35.00
    1122       10.00
    1122        0.00

Я хочу объединить таблицу выше 2 так, чтобы набор результатов стал как ниже. G_Amount (всего g_amount для каждого года из таблицы 1) & I_Amount (всего i_amount для каждого года из таблицы 2) следует отображать по годам.

Набор результатов:

    Year  G_Amount  I_Amount
    ===== ========  ========-
    2010   90.00     75.00
    2012  170.00     70.00  

Может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Ваша модель данных позволяет идентификатору объекта появляться в течение нескольких лет. Таким образом, соответствующие записи таблицы2 будут умножаться, то есть добавляться к каждому из этих лет. Если вы не хотите этого, вам нужна отдельная таблица с одной записью на объект.

Как вы бы агрегировали первую таблицу по году и идентификатору объекта, а вторую - только по идентификатору объекта. Затем присоединитесь и объединитесь, чтобы получить годы.

select
  t1.year,
  sum(t1.totalg) as total_g_amount,
  coalesce(sum(t2.totali), 0) as total_i_amount
from 
(
  select Year, ObjectId, sum(G_Amount) as totalg
  from table1 
  group by Year, ObjectId
) t1
left join
(
  select ObjectId, sum(i_Amount) as totali
  from table2
  group by ObjectId
) t2 on t2.ObjectId = t1.ObjectId
group by t1.year
order by t1.year;
0 голосов
/ 27 августа 2018

Примерно так будет работать для вашего набора данных. Я включил LEFT JOIN для любых значений в Table1, которых нет в Table2:

SELECT
    T1.[Year]
    , SUM(T1.G_Amount_Total) G_Amount
    , ISNULL(SUM(T2.I_Amount_Total), 0) I_Amount
FROM
    (
        SELECT
            [Year]
            , ObjectId
            , SUM(G_Amount) G_Amount_Total
        FROM Table1
        GROUP BY
            [Year]
            , ObjectId
    ) T1
    LEFT JOIN
        (
            SELECT
                ObjectId
                , SUM(I_Amount) I_Amount_Total
            FROM Table2
            GROUP BY ObjectId
        ) T2
    ON T1.ObjectId = T2.ObjectId
GROUP BY T1.[Year]

Я вижу некоторые потенциальные проблемы с вашей структурой данных, например, в Table2 нет ссылки на Year, однако, если ваши данные находятся под контролем, все должно сработать.

0 голосов
/ 27 августа 2018

Попробуйте, в любом случае, я новичок в T-SQL, так что это может быть неправильно.

Select DISTINCT T1.Year 
       SUM (T1.G_Amount) as G_Amount,
       SUM (T2.I_Amount) AS I_Amount
from table1 T1 join Table2 T2 on T1.ObjectID = T2.ObjectID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...