簡體   English   中英

帶有月列和多個字段行的mysql交叉表

[英]mysql crosstab with month columns and multiple field rows

創建不同產品的每月銷售摘要。 Zane Bien在此處發布的文章對於創建查詢以為單個產品生成一行非常有幫助:

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個查詢並將結果加載到數組中,然后從該數組中顯示。 一次獲取所有數據並按行顯示返回的結果似乎更有效率。

有沒有辦法做到這一點?

通過UNION操作是可能的。 理想情況下,應根據情況使用UNION ALL ,因為您的查詢似乎將根據每個收入來源的自定義計算產生唯一的結果。 UNION ALL將包含所有行,而UNION排除了重復的行,這可以說是更快的。

換一種說法:

(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

謝謝,丹尼爾。
我希望有一個CASE或類似的解決方案,它可以提高代碼效率,但是我猜這不是一個選擇。 不過,這將節省我創建一堆數組的時間。 布魯斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM