2012-08-06 40 views
0

這裏我有6個表在下面。我想獲得invoicetotaldebittotal組由稅收%mysql結合不同表中的數據使用單個分組按列

invoices 
-------- 
inv_id  col2 col3 
1   xxx  xxx 

invoice_ps 
----------- 
inv_fkid ps_fkid 
1    2 
1    3 
1    5 

packing_slips 
-------- 
ps_id col2 col3 
1  xxx  xxx 
2  xxx  xxx 
3  xxx  xxx 
4  xxx  xxx 
.... 

debits 
-------- 
db_id col2 col3 
1  xxx  xxx 


debit_ps 
----------- 
db_fkid  ps_fkid 
1    4 
1    7 
1    6 

transfers 
--------- 
ps_fkid  tax mrp qty 
2   0% 15 10 
3   15% 10 5 
4   5% 20 6 
5   15% 15 2 
7   0% 6  3 

我可以從這個

// Invoices 
SELECT tax, SUM(mrp * qty) AS Total FROM invoices i 
INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id 
INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid 
GROUP BY tax 

和借記總髮票總

// Debits 
SELECT tax, SUM(mrp * qty) AS Total FROM debits d 
INNER JOIN debit_ps db_ps ON db_ps.db_fkid = d.db_id 
INNER JOIN transfers ts ON ts.ps_fkid = db_ps.ps_fkid 
GROUP BY tax 

我如何結合上述2個查詢得到的結果taxwise如下

tax  invoicetotal - debittotal 
0%    xxxx   
5%    xxxx   
15%    xxxx   

感謝您的幫助

回答

0
Actually we can avoid IF condition in the query. 


    SELECT 
     dtax, dtotal, itotal 
    FROM 
     (SELECT tax dtax, SUM(mrp * qty) AS dTotal 
     FROM debits d 
     INNER JOIN debits_ps db_ps ON db_ps.db_fkid = d.db_id 
     INNER JOIN transfers ts ON ts.ps_fkid = db_ps.ps_fkid 
     GROUP BY tax) a 
     LEFT JOIN 
     (SELECT tax itax, SUM(mrp * qty) AS iTotal 
     FROM invoices i 
      INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id 
      INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid 
     GROUP BY tax) b 
     ON dtax = itax 
    UNION 
    SELECT 
     itax, dtotal, itotal 
    FROM 
     (SELECT tax dtax, SUM(mrp * qty) AS dTotal 
     FROM debits d 
     INNER JOIN debits_ps db_ps ON db_ps.db_fkid = d.db_id 
     INNER JOIN transfers ts ON ts.ps_fkid = db_ps.ps_fkid 
     GROUP BY tax) a 
     RIGHT JOIN 
     (SELECT tax itax, SUM(mrp * qty) AS iTotal 
     FROM invoices i 
      INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id 
      INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid 
     GROUP BY tax) b 
     ON dtax = itax 


    Jane, we need to play around with left/right joins and the two main queries (Invoices and Debits). 
    Will take the below data for example. 
    Debits - Output of Debits query 
    +------+--------+ 
    | dtax | dTotal | 
    +------+--------+ 
    | 0% |  18 | 
    | 5% | 120 | 
    +------+--------+ 
    Invoices - Output of Invoices query 
    +------+--------+ 
    | itax | iTotal | 
    +------+--------+ 
    | 0% | 150 | 
    | 15% |  80 | 
    +------+--------+ 

    Debits Left join with Invoices gives you all the tax wise debits and their matching invoices. 
    +------+--------+--------+ 
    | dtax | dtotal | itotal | 
    +------+--------+--------+ 
    | 0% |  18 | 150 | 
    | 5% | 120 | NULL | 
    +------+--------+--------+ 

    Debits Right join with Invoices will give you all the tax wise invoices and their matching debits. 
    +------+--------+--------+ 
    | itax | dtotal | itotal | 
    +------+--------+--------+ 
    | 0% |  18 | 150 | 
    | 15% | NULL |  80 | 
    +------+--------+--------+ 

    UNION is used to combine these two results into unique records. i.e duplicate records are removed. 
    +------+--------+--------+ 
    | dtax | dtotal | itotal | 
    +------+--------+--------+ 
    | 0% |  18 | 150 | 
    | 5% | 120 | NULL | 
    | 15% | NULL |  80 | 
    +------+--------+--------+ 
    NOTE: If you use UNION ALL, the duplicate records will not be removed. Just try with UNION ALL. You can find the difference. 

Query to find tax wise invoice-debit : 
    select dtax, if(itotal is null, 0, itotal)-if(dtotal is null, 0, dtotal) as `invoice-debit` from (SELECT dtax, dtotal, itotal FROM (SELECT tax dtax, SUM(mrp * qty) AS dTotal FROM debits d INNER JOIN debits_ps db_ps ON db_ps.db_fkid = d.db_id INNER JOIN transfers ts ON ts.ps_fkid = db_ps.ps_fkid GROUP BY tax) a LEFT JOIN (SELECT tax itax, SUM(mrp * qty) AS iTotal FROM invoices i INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid GROUP BY tax) b ON dtax = itax UNION SELECT itax, dtotal, itotal FROM (SELECT tax dtax, SUM(mrp * qty) AS dTotal FROM debits d INNER JOIN debits_ps db_ps ON db_ps.db_fkid = d.db_id INNER JOIN transfers ts ON ts.ps_fkid = db_ps.ps_fkid GROUP BY tax) a RIGHT JOIN (SELECT tax itax, SUM(mrp * qty) AS iTotal FROM invoices i INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid GROUP BY tax) b ON dtax = itax) x; 

You need to use UNION to combine the records. Otherwise you will not get both invoice and debits. 
+0

感謝您的解釋deepa,你是真棒。我剛剛得到一個新的查詢..我怎麼能顯示結果invoicetotal - debittotal集團稅?見上面更新的問題 – jane 2012-08-22 11:42:42

+0

我仍然需要使用UNIOIN? – jane 2012-08-22 11:44:19

+0

@Jane,檢查更新的評論新的查詢。 – Deepa 2012-08-22 13:59:16

0

像這樣的事情會工作

SELECT tax, 
    SUM(case when tag='inv' then mrp * qty else 0 end) AS InvoiceTotal, 
    SUM(case when tag='deb' then mrp * qty else 0 end) AS DebitTotal FROM 
    (
    select 'inv' as tag , col_list from invoices 
    union all 
    select 'deb' as tag , col_list from debit 
) as i 
INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id 
INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid 
GROUP BY tax 
+0

感謝您的快速回復。但我們不需要debit_ps表嗎? – jane 2012-08-06 13:55:21

+0

我很抱歉,但它似乎並沒有工作:( – jane 2012-08-06 14:08:56

0

希望下面的查詢爲您提供所需的輸出。

SELECT 
    IF(dtax IS NOT NULL, dtax, itax) tax, dtotal, itotal 
FROM 
    (SELECT tax dtax, SUM(mrp * qty) AS dTotal 
    FROM debits d 
    INNER JOIN debits_ps db_ps ON db_ps.db_fkid = d.db_id 
    INNER JOIN transfers ts ON ts.ps_fkid = db_ps.ps_fkid 
    GROUP BY tax) a 
    LEFT JOIN 
    (SELECT tax itax, SUM(mrp * qty) AS iTotal 
    FROM invoices i 
     INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id 
     INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid 
    GROUP BY tax) b 
    ON dtax = itax 
UNION 
SELECT 
    IF(dtax IS NOT NULL, dtax, itax) tax, dtotal, itotal 
FROM 
    (SELECT tax dtax, SUM(mrp * qty) AS dTotal 
    FROM debits d 
    INNER JOIN debits_ps db_ps ON db_ps.db_fkid = d.db_id 
    INNER JOIN transfers ts ON ts.ps_fkid = db_ps.ps_fkid 
    GROUP BY tax) a 
    RIGHT JOIN 
    (SELECT tax itax, SUM(mrp * qty) AS iTotal 
    FROM invoices i 
     INNER JOIN invoice_ps inv_ps ON inv_ps.inv_fkid = i.inv_id 
     INNER JOIN transfers ts ON ts.ps_fkid = inv_ps.ps_fkid 
    GROUP BY tax) b 
    ON dtax = itax 
+0

哇!這工作完全順便說一句,有什麼辦法可以簡化這個大查詢嗎?我的意思是,看看我上面寫的個人查詢。是我的頭頂上的東西..你爲我節省了大量的時間,我不可能很快就完成這個任務..再次感謝 – jane 2012-08-07 05:10:18

+0

任何人都可以請解釋這個查詢做什麼 – jane 2012-08-07 05:12:04

相關問題