2013-08-30 2 views
4

Это мой MySQL сервировкаMySQL Sum + Внутренний запрос в той же таблице

+----+---------+----------+---------+-------+ 
| id | AssetId | FromType | ToType | Amount | 
+----+---------+----------+---------+-------+ 
| 1 | 1  | Bank  | Asset | 10000 | 
+----+---------+----------+---------+-------+ 
| 2 | 2  | Bank  | Asset | 5000 | 
+----+---------+----------+---------+-------+ 
| 3 | 2  | Asset | Bank | 4000 | 
+----+---------+----------+---------+-------+ 
| 4 | 3  | Asset | Bank | 3000 | 
+----+---------+----------+---------+-------+ 
| 5 | 3  | Asset | Bank | 2000 | 
+----+---------+----------+---------+-------+ 

Приобретенные актив FromType 'Банк' в ToType 'активов'.
И проданные активы - тиски.

Как показать таблицу, как показано ниже.

+---------+----------+-----------+---------+ 
| AssetId | Purchase |  Sale | Balance | 
+---------+----------+-----------+---------+ 
|  1 | 10000 |   0 | 10000 |  
+---------+----------+-----------+---------+ 
|  2 |  5000 |  4000 | 1000 | 
+---------+----------+-----------+---------+ 
|  3 |  0 |  5000 | 5000 | 
+---------+----------+-----------+---------+ 

Заранее спасибо.

Я пробовал этот запрос. Но он не работает должным образом.

SELECT id as AssetId, debit, credit, 'Asset' AS tb_name 
    FROM ((
    SELECT id, SUM(`Amount`) AS debit, '0' AS credit 
     FROM `erp_assets` 
     WHERE FromType = 'Asset' 
     GROUP BY AssetId 
    ) UNION ALL (
    SELECT id, SUM(`Amount`) AS credit, '0' AS debit 
     FROM `erp_assets` 
     WHERE ToType = 'Asset' 
     GROUP BY AssetId 
    )) AS tb1 
+0

@RandomSeed Пожалуйста, проверьте вопрос. Я обновил его –

ответ

4

Я предполагаю, что в последней строке вашего примера выходной баланс должен быть -5000, а не 5000, правильно?

SELECT *, purchase - sale AS balance FROM (
    SELECT 
    assetid, 
    sum(if(fromtype='bank', amount, 0)) AS purchase, 
    sum(if(fromtype='asset', amount, 0)) AS sale 
    FROM foo f1 
    GROUP BY assetid 
) f2 

Во внутреннем запросе, сначала суммировать суммы, где fromtype является банк, в противном случае 0, и то же самое в другую сторону вокруг fromtype = актив. Разумеется, вся штука группируется по активам.

А затем во внешнем запросе мы выбираем все из внутреннего запроса и строим разницу (что напрямую не возможно во внутреннем запросе, потому что имена псевдонимов не доступны прямо там). Вуаля!

в действии здесь: http://sqlfiddle.com/#!2/05652/2

+0

Да, последний из них -5000. Прошу прощения за эту ошибку. :) –

1

Я предполагаю, что вы имели в виду покупку - продажа = баланс, и вы хотели -5000 в последнем ряду

CREATE TABLE bla 
    (
     id int AUTO_INCREMENT, 
     AssetId int, 
     FromType varchar(255), 
     ToType varchar(255), 
     Ammount int, 
     PRIMARY KEY(id) 
    ) ENGINE = MyISAM; 

    INSERT INTO bla(AssetId,FromType,ToType,Ammount) VALUES 
    (1,'Bank','Asset',10000), 
    (2,'Bank','Asset',5000), 
    (2,'Asset','Bank',4000), 
    (3,'Asset','Bank',3000), 
    (3,'Asset','Bank',2000); 



    SELECT 
     a.AssetId,a.Purchase as Purchase,a.Sale, a.Purchase-a.Sale as Balance 
    FROM (
    SELECT a.AssetId, 
     (SELECT IFNULL(SUM(b.Ammount),0) FROM bla as b 
     WHERE b.AssetId=a.AssetId AND FromType='Bank' AND ToType='Asset') as Purchase, 
     (SELECT IFNULL(SUM(b.Ammount),0) FROM bla as b 
     WHERE b.AssetId=a.AssetId AND FromType='Asset' AND ToType='Bank') as Sale 
    FROM bla as a 
    Group By a.AssetId) as a; 
Смежные вопросы