2013-04-27 72 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