php - 带有月份列和多个字段行的mysql交叉表

标签 php mysql

为不同的产品创建月度销售摘要。 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

关于php - 带有月份列和多个字段行的mysql交叉表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16248826/

相关文章:

java - Sonar 添加新项目

php - 取消设置空数组元素

php - Laravel - 如何列出集合中关系的所有键?

MySQL比较一个表中字段的值与不同表中行的值

php - mysql从其他表中获取数据

mysql - 查询每位艺术家今年的购买量

PHP 上传系统未将文件从临时目录移动到指定目录

php - Nginx 不会在 WSL 上执行 php 文件。我怎样才能解决这个问题?

php - 我将如何创建一个能够将 txt 导入 mysql 的解析器

php - 检查用户名和电子邮件是否已存在于数据库中