СУММА из другого столбца и из другой таблицы и показать результат в одной строке каждого года - PullRequest
2 голосов
/ 15 мая 2019

У меня есть две таблицы с именами table1 и table2. Я пытался суммировать некоторые столбцы, но результат показывает неправильный

Я пробовал следующий запрос mysql:

SELECT t1.year
     , SUM(t1.deposit) TOTALDEPOSIT
     , SUM(t1.interest) TOTALINTEREST 
     , SUM(t1.otherinterest) TOTALOTHER
  FROM table1 t1
  LEFT 
  JOIN table2 t2
    ON t1.year = t2.year
 GROUP 
    BY t1.year

Но результат SUM не показывает точно

Мои таблицы ниже

table1
| table1id| year| deposit| interest|
|---------|-----|--------|---------|
|        1|2019 |     20 |       1 |
|        2|2019 |     20 |       2 |
|        3|2019 |     20 |       1 |
|        3|2019 |     20 |       2 |
|        3|2020 |     20 |       3 |
|        3|2020 |     20 |       4 |

table2
| table2id| year | otherinterest|  
|----------------|--------------| 
|       1 | 2019 |        10    |       
|       2 | 2019 |        10    |  

Ожидаемый результат:

| YEAR | TOTALDEPOSIT| TOTALINTEREST  |TOTALOTHER |
|--------------------|----------------|-----------| 
| 2019 |       120   |        6       |     20    |
| 2020 |       40    |        7       |           |

Но мой запрос дает результат

| YEAR | TOTALDEPOSIT| TOTALINTEREST  |TOTALOTHER |
|--------------------|----------------|-----------| 
| 2019 |       160   |        12      |     80    |
| 2020 |       40    |        7       |           |

Так, пожалуйста, кто-нибудь может помочь мне решить этот вопрос?

Ответы [ 5 ]

3 голосов
/ 15 мая 2019

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

SELECT *
  FROM table1 t1
LEFT JOIN table2 t2
  ON t1.year = t2.year

Результат будет:

+----------+------+---------+----------+----------+------+---------------+
| table1id | year | deposit | interest | table2id | year | otherinterest |
+----------+------+---------+----------+----------+------+---------------+
|        1 | 2019 |      20 |        1 |        1 | 2019 |            10 |
|        2 | 2019 |      20 |        2 |        1 | 2019 |            10 |
|        3 | 2019 |      20 |        1 |        1 | 2019 |            10 |
|        3 | 2019 |      20 |        2 |        1 | 2019 |            10 |
|        1 | 2019 |      20 |        1 |        2 | 2019 |            10 |
|        2 | 2019 |      20 |        2 |        2 | 2019 |            10 |
|        3 | 2019 |      20 |        1 |        2 | 2019 |            10 |
|        3 | 2019 |      20 |        2 |        2 | 2019 |            10 |
|        3 | 2020 |      20 |        3 |     NULL | NULL |          NULL |
|        3 | 2020 |      20 |        4 |     NULL | NULL |          NULL |
+----------+------+---------+----------+----------+------+---------------+

Итак, у нас есть 10 строк, а не 6. Вы можете видеть, что, например, сумма депозитов за 2019 год равна 160То же число, что и в вашем "неправильном" результате.

Это потому, что для каждой записи в таблице 1, где год равен 2019, условие соединения (t1.year = t2.year) имеет значение дважды.Другими словами, для этой строки из таблицы1, где год равен 2019, у нас есть две строки в таблице результатов - одна с table2id = 1 и другая с table2id = 2.

2 голосов
/ 15 мая 2019

Подзапрос немного менее многословен, чем объединение.

drop table if exists t,t1;

create table t
(table1id int, year int, deposit int, interest int);
insert into t values
(        1,2019 ,     20 ,       1), 
(        2,2019 ,     20 ,       2), 
(        3,2019 ,     20 ,       1), 
(        3,2019 ,     20 ,       2), 
(        3,2020 ,     20 ,       3), 
(        3,2020 ,     20 ,       4); 

create table t1
( table2id int, year int, otherinterest int);  
insert into t1 values
(       1 , 2019 ,        10    ),       
(       2 , 2019 ,        10    );

select t.year,sum(deposit),sum(interest),
                (select sum(otherinterest) from t1 where t1.year = t.year) otherinterest
FROM t
group by t.year;



+------+--------------+---------------+---------------+
| year | sum(deposit) | sum(interest) | otherinterest |
+------+--------------+---------------+---------------+
| 2019 |           80 |             6 |            20 |
| 2020 |           40 |             7 |          NULL |
+------+--------------+---------------+---------------+
2 rows in set (0.00 sec)
1 голос
/ 15 мая 2019

Просто используйте простой подзапрос, и он будет работать.

SELECT A.year, SUM(A.deposit) TOTALDEPOSIT, SUM(A.interest) TOTALINTEREST, 
    (SELECT SUM(B.otherinterest) FROM table2 B WHERE B.year= A.year) TOTALOTHER
FROM table1 A 
GROUP BY A.year
0 голосов
/ 15 мая 2019

Простой GROUP BY с LEFT JOIN - это то, что вам нужно, но порядок этих операций должен отличаться от того, что у вас есть:)

select t1.year, 
       t1.deposit totaldeposit, 
       t1.interest totalinterest, 
       t2.otherinterest * t1.cnt totalother
from (
    select year, sum(deposit) deposit, sum(interest) interest, count(*) cnt
    from table1
    group by year
) t1 left join (
    select year, sum(otherinterest) otherinterest
    from table2
    group by year
) t2 on t1.year = t2.year
0 голосов
/ 15 мая 2019

Вы должны присоединиться к совокупному результату из каждой таблицы, например:

select  t1.year, tt1.totaldeposit, tt1.totalinterest, tt2.otherinterest
from   table1 t1
inner join  (
  select year, sum(deposit) totaldeposit, sum(interest) totalinterest
  from table1 
  group by year
) tt1 On t1.year = tt1.year
left join  (
   select year, sum(otherinterest) otherinterest
  from table1 
  group by year
) tt2 On t1.year = tt2.year
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...