如何根据日期列将行转换为列?
how to convert rows to columns based on date column?
这里是SQLfiddle
http://sqlfiddle.com/#!9/25542/2/0
我只想获取我的数据
Sale_On | Count Refunded | Count Sale | Count Cashback
-------------------------------------------------------
2015-09-07 | 1 | 5 | 1
我在 MySQL 中读到了 'case-when',但是,在这种情况下,我必须手动编写每个 order_status。
我该怎么做?除了将行转换为列之外还有其他解决方案吗?
如果您乐于对状态进行硬编码,则可以对它们执行聚合:
SELECT DATE(o.sale_on),
SUM(od.order_status=1) AS Sales,
SUM(od.order_status=2) AS Refunds,
SUM(od.order_status=3) AS Cashbacks
FROM orders o RIGHT JOIN order_detail od USING (order_id)
GROUP BY DATE(o.sale_on)
在 sqlfiddle 上查看。
否则,您实际上需要使用 master_order_status
table 上的查询动态生成类似的 SQL,以生成 select 列表中的相应列。
或者试试这个
select sale_on,
max(case when status='sale' then c end) as count_Sales,
max(case when status='Refunded' then c end) as count_Refunded,
max(case when status='CashBack' then c end) as count_CashBack
from
(
SELECT o.sale_on,od.order_status,COUNT(*) as c,mos.status FROM orders o
RIGHT JOIN order_detail od ON o.order_id = od.order_id
LEFT JOIN `master_order_status` mos ON mos.`status_id` = od.order_status
GROUP BY DATE(o.sale_on),od.order_status
) as t group by sale_on
SQL Fiddle http://sqlfiddle.com/#!9/25542/13
这里是SQLfiddle
http://sqlfiddle.com/#!9/25542/2/0
我只想获取我的数据
Sale_On | Count Refunded | Count Sale | Count Cashback
-------------------------------------------------------
2015-09-07 | 1 | 5 | 1
我在 MySQL 中读到了 'case-when',但是,在这种情况下,我必须手动编写每个 order_status。
我该怎么做?除了将行转换为列之外还有其他解决方案吗?
如果您乐于对状态进行硬编码,则可以对它们执行聚合:
SELECT DATE(o.sale_on),
SUM(od.order_status=1) AS Sales,
SUM(od.order_status=2) AS Refunds,
SUM(od.order_status=3) AS Cashbacks
FROM orders o RIGHT JOIN order_detail od USING (order_id)
GROUP BY DATE(o.sale_on)
在 sqlfiddle 上查看。
否则,您实际上需要使用 master_order_status
table 上的查询动态生成类似的 SQL,以生成 select 列表中的相应列。
或者试试这个
select sale_on,
max(case when status='sale' then c end) as count_Sales,
max(case when status='Refunded' then c end) as count_Refunded,
max(case when status='CashBack' then c end) as count_CashBack
from
(
SELECT o.sale_on,od.order_status,COUNT(*) as c,mos.status FROM orders o
RIGHT JOIN order_detail od ON o.order_id = od.order_id
LEFT JOIN `master_order_status` mos ON mos.`status_id` = od.order_status
GROUP BY DATE(o.sale_on),od.order_status
) as t group by sale_on
SQL Fiddle http://sqlfiddle.com/#!9/25542/13