56,681
社区成员
发帖
与我相关
我的任务
分享
CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_test`()
BEGIN
SET @column = '' ;
-- 取出动态列名
SELECT GROUP_CONCAT(CONCAT('SUM(IF(xm = ''' ,xm , ''',1,0)) AS ''',xmmc,''' ') ) INTO @column
FROM test_b ;
-- 生成动态SQL
SET @sql = CONCAT('SELECT rq
,',@column,'
FROM test_a
GROUP BY rq') ;
PREPARE s1 FROM @sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;
END
mysql> delimiter $$
mysql> create procedure p_ab()
-> begin
-> declare i,total int;
-> set total=(select count(id) from b);
-> set i=1;
-> set @var=concat('select\nifnull(date,p_name) as date,','\n');
-> while i<=total do
-> set @col=(select p_name from b where id=i);
-> if i!=total then
-> set @var=concat(@var,'count(if(p_name=\'',@col,'\',id,null)) as ',@col,',','\n');
-> else
-> set @var=concat(@var,'count(if(p_name=\'',@col,'\',id,null)) as ',@col,'\n');
-> end if;
-> set i=i+1;
-> end while;
-> set @var=concat(@var,'from\na left join b on project=id\ngroup by date;');
-> prepare ss from @var;
-> execute ss;
-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql>
mysql> call p_ab;
+------------+---+---+---+---+---+
| date | A | B | C | D | E |
+------------+---+---+---+---+---+
| 2014-01-01 | 2 | 0 | 0 | 0 | 0 |
| 2014-01-02 | 0 | 1 | 1 | 0 | 0 |
| 2014-01-04 | 0 | 1 | 0 | 0 | 0 |
| 2014-01-05 | 0 | 0 | 0 | 2 | 0 |
+------------+---+---+---+---+---+
4 rows in set (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
select
ifnull(date,p_name) as date,
count(if(p_name='A',id,null)) as A,
count(if(p_name='B',id,null)) as B,
count(if(p_name='C',id,null)) as C,
count(if(p_name='D',id,null)) as D
from
a left join b on project=id
group by date;
mysql> select
-> ifnull(date,p_name) as date,
-> count(if(p_name='A',1,null)) as A,
-> count(if(p_name='B',2,null)) as B,
-> count(if(p_name='C',3,null)) as C,
-> count(if(p_name='D',4,null)) as D
-> from a left join b on project=id
-> group by date;
+------------+---+---+---+---+
| date | A | B | C | D |
+------------+---+---+---+---+
| 2014-01-01 | 1 | 0 | 0 | 0 |
| 2014-01-02 | 0 | 1 | 1 | 0 |
| 2014-01-04 | 0 | 1 | 0 | 0 |
| 2014-01-05 | 0 | 0 | 0 | 2 |
+------------+---+---+---+---+
4 rows in set, 1 warning (0.00 sec)