0

私は2 つの db テーブルを持っています: 顧客情報と残高

顧客: Customer_ID、名前

Transaction : Customer_ID, Transaction_Name, Transaction_Amount... (他の列ですが、私の質問には必要ありません)

予想されるクエリ出力の例:

Customer_ID | Debit_Balance | Credit_Balance
1           |         500.00|
2           |               | 300.00

説明:顧客 1 には 500.00 の残高があり、顧客 2 には 300.00 の余分な金額が支払われています(これは通常 (-) 性質上マイナスです)

質問:

単一のクエリだけでこれを行う方法は? Debit_BalanceとCredit_Balance positivePhp negative.

更新: 私はこの取引金額の処理を行っていました: 私Transaction_Amountはそれらに基づいてすべてを合計しますTransaction_Name

すなわち

残高 = (すべての取引名 'SALES' )減算 (-) (すべての取引名 'PAYMENT')

しかし、これにより、レポートのリポジトリテーブルとしてダミーテーブルを作成し、比較してINSERTするためのPHP条件を追加する必要があります。

4

3 に答える 3

1

顧客ごとに 1 行の出力が必要で、残高がプラスかマイナスかに応じて 1 つの列または別の列に表示されます。試してください (標準 SQL を使用している場合):

select
  subqry.Customer_ID
, case
    when subqry.Balance >= 0 then subqry.Balance
  end as Debit_Balance
, case
    when subqry.Balance < 0 then subqry.Balance * -1
  end as Credit_Balance
from (
  select
    Customer_ID
  , sum(
      case Transaction_Name
        when 'SALES' then Transaction_Amount
        when 'PAYMENT' then Transaction_Amount * -1
        else null
      end
    ) as Balance
  from Transaction
  group by Customer_ID
) as subqry

Customer Name はどこにも使用していないため、ここまで Customer テーブルと結合する必要はありません。

于 2013-02-26T02:23:59.210 に答える
1

私は以下のようなものを使用します:

SELECT C.customer_id, C.Name, 
IF(SUM(Transaction_Amount)>0, SUM(Transaction_Amount),'') as Debit_Balance,  
IF(SUM(Transaction_Amount)<=0, SUM(Transaction_Amount),'') as Credit_Balance
From Customer As C 
LEFT JOIN Transaction  As T ON C.customer_id = T.customer_id
GROUP BY T.customer_id
于 2013-02-25T12:57:15.997 に答える
0

これより簡単なことは思いつきません:

SELECT c.customer_id, pos.amount debit_balance, neg.amount credit_balance
FROM customer c
LEFT JOIN (SELECT SUM(t.transaction_amount) amount, t.customer_id
           FROM   transaction t
           WHERE  t.transaction_amount > 0
           GROUP BY t.customer_id) pos ON pos.customer_id = c.customer_id
LEFT JOIN (SELECT SUM(t2.transaction_amount) amount, t2.customer_id
           FROM   transaction t2
           WHERE  t2.transaction_amount < 0
           GROUP BY t2.customer_id) neg ON neg.customer_id = c.customer_id

最初のサブクエリは各顧客のすべての正の値を合計し、2 番目のサブクエリはすべての負の値を合計します。次に、すべての顧客を取得し、2 つの対応する値を 1 つの結果に結合します。

于 2013-02-25T12:46:54.860 に答える