2013-04-27 36 views
2

爲不同產品創建月度銷售彙總。贊恩邊張貼在這裏非常有幫助創建查詢產生的一行單品:具有月份列和多個字段行的mysql交叉表

Income Source Jan Feb Mar -- Total Pct 
Report Fees 11285 12745 17980 ... 236970 95.9954 

下面是查詢:

SELECT "Report Fees" AS `Income Source`, 
SUM(IF(MONTH(b.ord_billed_time) =1, b.ord_fee_report, 0)) AS Jan, 
SUM(IF(MONTH(b.ord_billed_time) =2, b.ord_fee_report, 0)) AS Feb, 
SUM(IF(MONTH(b.ord_billed_time) =3, b.ord_fee_report, 0)) AS Mar, 
"..." AS `--` , 
SUM(b.ord_fee_report) AS Total, 
AVG(b.ord_fee_report/b.ord_fee_total) *100 AS Pct 
FROM orders b 
WHERE b.ord_billed_time IS NOT NULL 
AND b.ord_cancelled_time IS NULL 
AND b.ord_fee_report IS NOT NULL 
AND year(b.ord_billed_time) = 2012 
AND b.clientID = 8 

有沒有辦法讓我得到擴大這一單查詢8行,每種不同的收入類型和「總計」行?事情是這樣的:

Income Source Jan Feb Mar -- Total Pct 
Report Fees 11285 12745 17980 ... 236970 95.9954 
Income Type2 5401 3320 1394 ... 13456 0.321 
Income Type3  98 421 14 ... 1102 0.001 
... 
Total   333333 22222 11111 ... 9999999 100.0 

收入類型存儲在在單獨的列訂單表:ord_fee_x,ord_fee_y,ord_fee_z等

現在我正在8查詢和加載結果到一個數組,然後從該數組中顯示。看起來效率更高,一次全部獲取數據並逐行顯示返回。

有沒有辦法做到這一點?

回答

0

有可能通過UNION操作。理想情況下,您應該使用UNION ALL來處理您的情況,因爲看起來您的查詢將根據每個收入來源的自定義計算生成唯一結果。與UNION相比,UNION ALL將包括所有可以更快速的行,這排除了重複的行。

換句話說:

(SELECT "Report Fees" AS `Income Source`, 
SUM(IF(MONTH(b.ord_billed_time) =1, b.ord_fee_report, 0)) AS Jan, 
SUM(IF(MONTH(b.ord_billed_time) =2, b.ord_fee_report, 0)) AS Feb, 
SUM(IF(MONTH(b.ord_billed_time) =3, b.ord_fee_report, 0)) AS Mar, 
"..." AS `--` , 
SUM(b.ord_fee_report) AS Total, 
AVG(b.ord_fee_report/b.ord_fee_total) *100 AS Pct 
FROM orders b 
WHERE b.ord_billed_time IS NOT NULL 
AND b.ord_cancelled_time IS NULL 
AND b.ord_fee_report IS NOT NULL 
AND year(b.ord_billed_time) = 2012 
AND b.clientID = 8) 
UNION ALL 
(... query 2 ...) 
UNION ALL 
(... query 3 ...) 

等等。

參考http://dev.mysql.com/doc/refman/5.0/en/union.html

0

謝謝,丹尼爾。
我希望得到一個CASE或類似的解決方案,它會更有效率,但猜測這不是一個選項。不過,會幫我節省一些數組。 布魯斯

+0

當你想給感謝或更多的信息,你應該使用評論 - 而不是答案。 – Damiqib 2013-04-27 16:28:32

+0

Damiqib:對不起,這個網站是新手。將來會這樣做。 – Bruce 2013-04-28 17:22:38