[英]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 ...)
等等。
謝謝,丹尼爾。
我希望有一個CASE或類似的解決方案,它可以提高代碼效率,但是我猜這不是一個選擇。 不過,這將節省我創建一堆數組的時間。 布魯斯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.