2016-02-24 2 views
0

У меня есть 2 таблицы T1 (месяц + год уникальна)SQL таблица Обновления на основе другой таблицы

month year amount 
    10  2015  5000 
    11  2015  4000 

T2

month year  amount 
    10  2015  100 
    10  2015  200 
    10  2015  200 
    11  2015  200 

Я хочу, чтобы обновить количество поля T1 следующего T1.amount = T1.amount - (сумма суммы в T2 для соответствующего месяца, года)

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

month year amount 
    10  2015 4500 
    11  2015 3800 

Я не эксперт в SQL, любезно предлагаю SQL для достижения вышеуказанного, спасибо!

+0

Ребята, эти решения работали на SQL, когда я пытался в онлайн-инструментов тестирования, но оба приведенных ниже решений не работают на андроид SQLite, это дает ошибку синтаксиса в «AS» и " INNER ", PLS help – user3796596

ответ

1

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

UPDATE TABLE1 AS T1 
JOIN (SELECT month, year, SUM(amount) AS amount 
     FROM TABLE2 
     GROUP BY month, year) AS T2 
    ON T1.month = T2.month AND T1.year = T2.year 
SET T1.amount = T1.amount - T2.amount; 

Demo here

Edit:

В SQLite у вас есть для использования коррелированного подзапроса для выполнения UPDATE:

UPDATE TABLE1 
SET amount = amount - (SELECT SUM(amount) 
         FROM TABLE2 
         WHERE TABLE1.month = TABLE2.month AND 
         TABLE1.year = TABLE2.year); 

Demo here

+0

благодарит Giorgos, он отлично работает! – user3796596

+0

Giorgos, решение работало на SQL, когда я пытался в онлайн-инструментах тестирования, но это не работает на sqlite для Android, оно дает синтаксическую ошибку в ключе AS, PLS help – user3796596

+0

@ user3796596 Вы отметили вопрос с помощью mysql. sqlite, вероятно, имеет несколько иной синтаксис обновлений. –

1
UPDATE T1 
INNER JOIN 
( 
    SELECT 
    `month`, 
    `year`, 
    SUM(amount) totalAmount 
    FROM T2 
    GROUP BY `month`,`year` ) t 
ON t.`month` = T1.`month` AND t.`year` = T1.`year` 
SET T1.amount = T1.amount - t.totalAmount; 

SQL FIDDLE

Объяснение:

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

Внутренний запрос:

SELECT 
`month`, 
`year`, 
SUM(amount) totalAmount 
FROM T2 
GROUP BY `month`,`year` 

Для данных образцов она возвращает результат, как показано ниже:

Я назвал его t стол

month year totalAmount 

10  2015  500 

11  2015  200 

Теперь, если вы присоединиться к этой t таблицу с T1 таблица НА month и year

, что означает строку из двух таблиц будет объединен только если T1.month equals t.monthand T1.year equals t.yearИ только тогда вы будете обновлять соответствующее количество строки T1 таблицы, как показано ниже:

T1.amount = T1.amount - t.totalAmount

Таким образом, после этого обновления вашего T1 table должен выглядеть как показано ниже:

SELECT 
* 
FROM T1 

Результат:

month  year amount 

10  2015  4500 

11  2015  3800 

Редактировать: Вы отметили вопрос MySQL, пока ожидаете, что запрос будет работать в SqlLite. SQLlite doesn't support JOIN in Update statements.

Sqllite запрос:

UPDATE T1 
SET T1.amount = T1.amount - (
    SELECT 
     SUM(T2.amount) 
    FROM 
     T2 
    WHERE 
     T1.`month` = T2.`month` 
    AND T1.`year` = T2.`year` 
); 
+0

Пожалуйста, дайте мне знать, если я смог заставить вас понять это. @ user3796596 – 1000111

+0

Звучит здорово! Добро пожаловать :) @ user3796596 – 1000111

+0

Subrata, решение работало на SQL, когда я пытался использовать онлайн-инструменты тестирования, но это не работает на sqlite для Android, оно дает синтаксическую ошибку при ключевом слове «JOIN», PLS help – user3796596

Смежные вопросы