2011-07-12 71 views
1

我正在爲我正在開發的應用程序編寫一些相當複雜的查詢報告。我可能通過使用更高級別的PHP來實現以下所有功能,但顯然我希望完成所有的MySQL操作,這顯然會大大簡化事情。MySQL高級子查詢重複

我需要的報告是一個典型的銷售報告類型查詢,它將列出人員列表以及與其相關的一些相關總計。唯一的區別是這個系統涉及貨運/拖運,所以「銷售人員」實際上是卡車司機,而「銷售」是單個貨物。此外,通過創建「路線」,託運貨物僅與其各自的司機相關/綁定,記錄誰在特定的一天交付/收集貨物。

當然,我可以使用INNER JOIN獲得每個驅動程序的列表,以及它們已交付/收集的所有託運貨物,並將這些貨物的收入彙總在一起。然而,問題來了,當我需要顯示一個列共交付收入收集收入。這些數字可以來自貨物表,其中列出了每一批貨物。每批貨物都可以有一個標誌(ENUM「D」,「C」),用於表示是交貨還是收貨。這幾乎可以通過使用子查詢來確定,但仍然會有很多重複。

我有什麼至今:

SELECT pr.driver_callsign, d.first_name, d.last_name, sum(pc.revenue) AS total_revenue 
FROM pallet_routes AS pr 
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign 
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id 
GROUP BY pr.driver_callsign 
ORDER BY d.driver_callsign ASC 

這顯然返回每個驅動器的列表,收入來自他們綁在他們的所有貨物進行的總量。

什麼是最有效的方法來進一步拆分revenue SUM字段最多顯示SUM(revenue) WHERE type = "C"SUM(revenue) WHERE type="D"?子查詢?聯盟?

也值得一提的是,結束查詢將縮小到一個日期範圍。舉例來說,將有一個WHERE date BETWEEN x AND ypallet_routes表。

任何意見都會很好地收到。請確定你是否想要我詳細說明。

回答

1

我不知道你的列type是的,但如果它在pallet_consignments,你可以嘗試以下方法:

SELECT pr.driver_callsign, d.first_name, d.last_name, 
SUM(IF(pc.`type` = 'C', pc.revenue, 0)) collection_revenue, 
SUM(IF(pc.`type` = 'D', pc.revenue, 0)) delivery_revenue 
FROM pallet_routes AS pr 
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign 
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id 
GROUP BY pr.driver_callsign 
ORDER BY d.driver_callsign ASC 

否則,請註明其中列type是。

+0

嘿謝謝你的時間。類似這樣的理論在理論上是可行的,我同意,但MySQL解釋器不喜歡它並報告: '您的SQL語法有錯誤;檢查對應於您的MySQL服務器版本的手冊,以便在'SUM(IF(pc.'type' ='D',pc.revenue,0))附近使用正確的語法作爲delivery_revenue FROM pallet_routes'at line 3' – George

+1

@George:忘記前一個SUM的逗號!嘗試更新的查詢。 – Shef

+1

Shef,謝謝你的回覆!更新後的查詢完美無瑕,非常感謝!它甚至沒有跨越我的想法,我可以使用這樣的IF來實現這些結果! – George