2

为不同的产品创建月度销售摘要。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 个查询并将结果加载到一个数组中,然后从该数组中显示。一次获取所有数据并逐行显示返回的数据似乎更有效。

有没有办法做到这一点?

4

2 回答 2

0

通过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

于 2013-04-27T05:54:33.577 回答
0

谢谢,丹尼尔。
我希望有一个 CASE 或类似的解决方案可以提高代码效率,但我猜这不是一个选择。不过,这将节省我创建一堆数组的时间。布鲁斯

于 2013-04-27T16:26:22.873 回答