我将order_lines的数据库架构设为
product_id, quantity, created_at
我想查询结果
date 1 2 3 4 5 ..
product 1 count 2 ...
product 2 count 5 ...
可以在mySQL中执行此操作吗?
答案 0 :(得分:1)
是的,我的交叉表查询应该可以解决问题。
这可能会有所帮助: http://forums.mysql.com/read.php?20,110464,110464
http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html
答案 1 :(得分:0)
select product_id, sum(quantity) from order_lines group_by product_id
答案 2 :(得分:0)
这是一个可能的解决方案。您可能需要对其进行修改以满足您的需求:
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`ordertotals` $$
CREATE PROCEDURE `test`.`ordertotals` ()
BEGIN
DECLARE `xtab_qry` VARCHAR(4096) DEFAULT '';
SELECT CONCAT('SELECT o.product_id ',
GROUP_CONCAT(
DISTINCT
CONCAT(', SUM(IF(o.created_at="', ol.created_at,
'",o.quantity,null)) AS "',
DATE_FORMAT(ol.created_at, "%m/%d/%Y"),
'"')
ORDER BY ol.created_at
SEPARATOR ''
),
' FROM orderlines o WHERE 1 GROUP BY o.product_id'
) AS stuff
INTO
@xtab_qry
FROM
orderlines ol
WHERE 1;
PREPARE my_sql_statement
FROM @xtab_qry;
EXECUTE my_sql_statement;
DEALLOCATE
PREPARE my_sql_statement;
END $$
DELIMITER ;
使用此测试数据:
product_id quantity created_at
1 4 2009-09-14
1 5 2009-09-14
2 2 2009-09-14
3 3 2009-09-13
1 9 2009-09-15
1 2 2009-09-16
它产生了这些结果:
product_id 09/13/2009 09/14/2009 09/15/2009 09/16/2009
1 9 9 2
2 2
3 3
希望这有帮助!
编辑: 总之,这样做是为了创建一个生成动态SQL字符串的存储过程。然后它执行该查询。这就是为什么这需要在存储过程中。 indiecompanyllc指出我刚才用过的一篇很棒的文章来学习如何做到这一点。以下是该链接:http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html。