2017-08-03 19 views
0

私は2つのテーブルevouchers,pos_vendor_mapを持っています。 pos_vendor_mapテーブルにPOS_IDのリストがあります。 evouchersは複数のトランザクションを持ち、同じPOS_IDになることができます。別のテーブルの値に基づいてクエリを実行します。

pos_vendor_map:

ID POS_ID  VendorName 
1 1   Test1 
2 2   Test2 

evoucher:

ID TRANS_TYPE TRANS_AMOUNT TRANS_STATUS POS_ID 
1 1   2000   1   1 
2 1   3000   1   1 
3 1   1000   1   2 
4 1   5000   1   2 

は、今私はevouchersテーブルから各POS_IDのための取引の合計を取得したいです。だから、

foreach(POS_ID) 
{ 
SUM(TRANS_AMOUNT) 
} 

現在、私は取得していた結果のようなものになりますが、クエリでPOS_IDを与えることによって、私はそれがダイナミックになりたい、それぞれこのクエリを実行するために、その後POS_IDsの総数をチェックしたいです。

SELECT 
    (SUM(IF(ev.TRANS_TYPE='1', ev.TRANS_AMOUNT,0)) - SUM(IF(ev.TRANS_TYPE='2', ev.TRANS_AMOUNT,0))) AS CreditStatus, 
    (select pvm.VENDOR_NAME from pos_vendor_map pvm where pvm.POS_ID = ev.POS_ID) AS VendorName 
FROM 
    evouchers ev 
WHERE 
    ev.POS_ID='1' and ev.TRANS_STATUS='1'; 

おかげ

答えて

1

このクエリからの合計を見つけることができます。そして、あなたはPOS_IDごとに1つの行をしたい場合は

SELECT SUM(CASE WHEN ev.TRANS_TYPE = 1 THEN ev.TRANS_AMOUNT 
       WHEN ev.TRANS_TYPE = 2 THEN -ev.TRANS_AMOUNT 
       ELSE 0 
      END) as CreditStatus 
     -- pvm.VENDOR_NAME 
FROM evouchers ev JOIN 
    pos_vendor_map pvm 
    ON pvm.POS_ID = ev.POS_ID; 

SELECT SUM(CASE WHEN ev.TRANS_TYPE = 1 THEN ev.TRANS_AMOUNT 
       WHEN ev.TRANS_TYPE = 2 THEN -ev.TRANS_AMOUNT 
       ELSE 0 
      END) as CreditStatus, 
     pvm.VENDOR_NAME 
FROM evouchers ev JOIN 
    pos_vendor_map pvm 
    ON pvm.POS_ID = ev.POS_ID 
GROUP BY ev.POS_ID, pvm.VENDOR_NAME 
+0

はい。私は以下の方法で問題を解決しましたが、あなたのものも同じです。ありがとう。 ' \t ev.POS_ID \tを選択pvm.VENDOR_NAME AS VendorName \t、(SUM((ev.TRANS_TYPE = '1'、ev.TRANS_AMOUNT、0))IF - SUM((ev.TRANS_TYPE = '2' IF 、ev.TRANS_AMOUNT、0))) evouchersのEV FROM CreditStatus は\t ev.POS_ID \t BY pvm.POS_ID = ev.POS_ID ev.TRANS_STATUS = '1' GROUP、上pos_vendor_map PVMに参加左AS pvm.VENDOR_NAME; ' –

0

あなたはあなたのクエリは、おそらく次のようになります

select POS_ID,count(POS_ID) total from evoucher group by POS_ID 
0

あなたが累積合計をしたい場合は、このような何か試すことができます。

SELECT C.VendorName 
,A.* 
, @r:= CASE WHEN @g=A.POS_ID THEN 
      CASE WHEN A.TRANS_TYPE=1 THEN @r+A.TRANS_AMOUNT WHEN A.TRANS_TYPE=2 THEN @r-A.TRANS_AMOUNT ELSE 0 END 
     ELSE A.TRANS_AMOUNT END AS AMOUNT 
, @g:=A.POS_ID g 
FROM EVOUCHER A 
CROSS JOIN (SELECT @r:=0 , @g:=0) B 
INNER JOIN POS_VENDOR C ON A.POS_ID = C.POS_ID 
ORDER BY A.POS_ID, A.ID; 

出力:

VendorName id trans_type trans_amount trans_status pos_id AMOUNT g 
Test1 1 1 2000 1 1 2000 1 
Test1 2 1 3000 1 1 5000 1 
Test1 5 2 1000 1 1 1000 1 
Test2 3 1 1000 1 2 1000 2 
Test2 4 1 5000 1 2 6000 2 
Test2 6 2 500 1 2 500 2 

サンプルデータ:正確

CREATE TABLE EVOUCHER(id int, trans_type int, trans_amount int, trans_status int, pos_id int); 
INSERT INTO EVOUCHER VALUES (1,1,2000,1,1); 
INSERT INTO EVOUCHER VALUES (2,1,3000,1,1); 
INSERT INTO EVOUCHER VALUES (3,1,1000,1,2); 
INSERT INTO EVOUCHER VALUES (4,1,5000,1,2); 
INSERT INTO EVOUCHER VALUES (5,2,1000,1,1); 
INSERT INTO EVOUCHER VALUES (6,2,500,1,2); 
CREATE TABLE POS_VENDOR (id int, pos_id int, VendorName VARCHAR(20)); 
INSERT INTO POS_VENDOR VALUES (1,1,'Test1'); 
INSERT INTO POS_VENDOR VALUES (2,2,'Test2'); 
関連する問題