2014-02-12 79 views
0

我有两个表Received和Issued,它们与ID字段有关。我试图使用下面的查询来获得结果,并且它只在两个表都有值时才起作用。但是,当一个表为空时,查询返回NULL值。我需要帮助,请SQL查询:从不同的表中总结两个不同的列

SELECT 
    c.vaccine_id, 
    c.name, 
    SUM(QRecived-IsuedQuan) Quantity 
FROM 
    vaccine c 
    LEFT OUTER JOIN (
     SELECT SUM(quantity_recieved) QRecived,vaccine_id from vaccine_detail group by vaccine_id 
    ) a ON a.vaccine_id=c.vaccine_id 
    LEFT OUTER JOIN (
     select SUM(issued_quantity) IsuedQuan,vaccine_id from issued_item group by vaccine_id 
    ) b ON b.vaccine_id=a.vaccine_id " 
GROUP BY c.vaccine_name,c.vaccine_id "; 

注:上面的查询会SQLite中被运行,这仅仅是通知你,SQLLITE不支持RIGHT & FULL JOIN的

+0

也许用SUM(coalesce(QRecived,0) - coalesce(IsuedQuan,0))替换主查询中的SUM(QRecived-IsuedQuan)'会解决这个问题吗? – FrankPl

回答

0
SELECT c.vaccine_id, 
     c.name, 
     SUM(IfNull(QRecived,0) - IfNull(IsuedQuan,0)) Quantity 
FROM vaccine c 
.... 

应该照顾那。

+0

是否支持sqllite ISNULL?阅读[本](http://stackoverflow.com/questions/7999608/null-substitution-in-sqlite) – Arion

+0

排序。欢呼声@Arion –

3

您不需要外部group by。问题是,当没有比赛,该值是NULL,所以你需要与另一个值来代替它们:

SELECT v.vaccine_id, v.name, 
     coalesce(r.QReceived, 0) - coalesce(i.IssuedQuan, 0) as Quantity 
FROM vaccine v LEFT OUTER JOIN 
    (SELECT SUM(quantity_recieved) as QReceived, vaccine_id 
     FROM vaccine_detail 
     GROUP BY vaccine_id 
    ) r 
    ON r.vaccine_id = v.vaccine_id LEFT OUTER JOIN 
    (SELECT SUM(issued_quantity) as IssuedQuan, vaccine_id 
     FROM issued_item 
     GROUP BY vaccine_id 
    ) i 
    ON i.vaccine_id = v.vaccine_id; 

您可以使用isnull()coalesce(),但coalesce()是这样做的ANSI标准功能。

+0

感谢您的解决方案。它完美的作品。再次感谢命名也。 – Dan

相关问题