2016-07-16 8 views
0

I表Xを有する:条件付き合計、表Xの値を表示そして表Xからの条件に基づいて合計を生成する

| key | name | drcr | drcr_other | coa_type | coa_header | 
|-----|--------|------|------------|----------|------------| 
| 1 | assets | dr | cr   | head  |   | 
| 2 | cash | dr | cr   | sub  | assets  | 
| 3 | bank | dr | cr   | sub  | assets  | 
| 4 | equity | cr | dr   | head  |   | 
| 5 | income | cr | dr   | sub  | equity  | 

I表Yを有する:

| key | account | drcr | amount | 
|-----|---------|------|--------| 
| 1 | bank | dr | 1000 | 
| 2 | income | cr | 1000 | 
| 3 | cash | dr | 100 | 
| 4 | bank | cr | 100 | 

私はそれが示すようにクエリを生成したいと思います: 資産と資本は、そのサブアカウントの合計(ヘッダー行)です。例えば、収入のために株式のサブアカウントがあると収入が1000であることから、資本は1000

| account | amount | 
|---------|--------| 
| bank | 900 | 
| income | 1000 | 
| cash | 100 | 
| assets | 1000 | 
| equity | 1000 | 

は、今のところ、私はそれらが表Yに追加する金額を持っているとしてまとめるために銀行と現金を得ることができなければなりません、私は資産の合計(現金と銀行の合計)と資本(所得の合計)をどのように追加するかについては不明です。現在、私は私がcoa_headerとcoa_typeフィールドを使用して合計を合計する可能性が考えていた...

SELECT name, 
SUM( 
    IF(account = name AND Y.drcr = X.drcr, amount, 0) - IF(account = name AND Y.drcr = X.drcr_other, amount, 0) 
) 
AS Total FROM `Y`, `X` 
GROUP BY name ORDER BY name 

を次のステートメントを使用して、すべてを合計しています。私はMySQLを初めて使っていて、ちょうど遊んでいます。これはちょうど私が改造している個人的な夏のプロジェクトです。どんな助けでも感謝しています!

これは、1100年にはクレジットカードやデビットのそれぞれがあるので、私は、あなたがbankのために900を取得する方法を理解していないすべてのMySQL 5.0.11に

+0

なぜ 'equity 1000'という行はありませんか? – splash58

+0

まず、 'INNER JOIN'を使用してテーブルを'結合 'する必要があります –

+0

このサンプルデータを作成するときに、株式行を追加するのを忘れてしまいました。私は今それを追加します。 –

答えて

0

です。あなたが合計を引くなら、もちろん0になります。

私ができることは、減算を可能にする方法を示しています。次に、あなた自身のクエリをテクニックに提供することができます。

このトリックは、フォールディングとして知られています。各行に対して、Nを作成します。加算/減算したい列は2つの列(あなたの場合はN = 2)になり、次にそれらを減算するだけです。

ここで基本的な考え方です:

select account, side 
      , case side when 'dr' then amount else 0 end as debit 
      , case side when 'cr' then amount else 0 end as credit 
    from (
     select 'dr' as side UNION select 'cr' 
    ) as U 
    cross join T 
    where account = 'bank' 
    ; 
account  side  debit  credit  
---------- ---------- ---------- ---------- 
bank  cr   0   1000  
bank  cr   0   100  
bank  dr   1000  0   
bank  dr   100   0   

私たちは、このように1行にそれを圧縮することができます

select account 
     , sum(case side when 'dr' then amount else 0 end) as debit 
     , sum(case side when 'dr' then amount else 0 end) as debit 
from (
    select 'dr' as side UNION select 'cr' 
) as U 
cross join T 
where account = 'bank' 
group by account 
; 
account  debit  debit  
---------- ---------- ---------- 
bank  1100  1100  

あなたの課題は、借方(私が推測する)ような方法であなたのテーブルを結合することです側は100です。次に減算が簡単に来ます。 :-)

HTH。

関連する問題