2012-04-02 78 views
2
SELECT 
    C.SOId, Ser.TotalService, S.TotalSales 
FROM 
    salesorder C 
    INNER JOIN (SELECT SOId,SUM(charge) as TotalService FROM sales_serviceline GROUP BY SOId) Ser 
    ON C.SOId = Ser.SOId 
    INNER JOIN (SELECT SOId,SUM(PriceEach*qty) as TotalSales FROM salesline GROUP BY SOId) S 
    ON C.SOId = S.SOId 

說明: 一個SalesOrder有許多salesline的 一個SalesOrder有許多salesline服務的SQL的GroupBy和InnerJoin

因此,如果salesorder有saleslins & salesline_service那麼上面的查詢成功retrives是salesorder總量,但如果只有鹽線或只有銷售線服務銷售訂單不重試如何更改此查詢以獲取所有結果?

+0

是什麼問題? 「所有結果」是什麼意思? – aProgrammer 2012-04-02 07:02:04

回答

3

我認爲您在尋找一個LEFT JOIN。如果在SerS無行,那麼LEFT JOIN會讓TotalServiceTotalSalesNULL

SELECT 
    C.SOId, Ser.TotalService, S.TotalSales 
FROM 
    salesorder C 
    LEFT JOIN (SELECT SOId,SUM(charge) as TotalService FROM sales_serviceline GROUP BY SOId) Ser 
    ON C.SOId = Ser.SOId 
    LEFT JOIN (SELECT SOId,SUM(PriceEach*qty) as TotalSales FROM salesline GROUP BY SOId) S 
    ON C.SOId = S.SOId 

如果你不想讓他們爲NULL。那麼你可以簡單的使用COALESCE()。像這樣:

SELECT 
    C.SOId, 
    COALESCE(Ser.TotalService,0) AS TotalService, 
    COALESCE(S.TotalSales,0) AS TotalSales 
FROM 
    salesorder C 
    LEFT JOIN (SELECT SOId,SUM(charge) as TotalService FROM sales_serviceline GROUP BY SOId) Ser 
    ON C.SOId = Ser.SOId 
    LEFT JOIN (SELECT SOId,SUM(PriceEach*qty) as TotalSales FROM salesline GROUP BY SOId) S 
    ON C.SOId = S.SOId 
+0

'ISNULL()'是一個MySQL函數。 ANSI標準定義了'COALESCE()',它可以在幾乎所有的DBMS中使用。 – 2012-04-02 07:08:26

+0

謝謝指出。它也是一個MSSQL函數。 – Arion 2012-04-02 07:09:39

+0

是的,我的錯誤。 SQL-Server有'ISNULL()'。 MySQL具有等價的'IFNULL()'。 (MySQL的'ISNULL()'做了一些不同的事情) – 2012-04-02 07:16:13