如何基于存储过程参数制作动态数据透视表

时间:2015-03-20 09:16:03

标签: mysql stored-procedures pivot-table

如何使存储过程显示动态透视列?当前查询只能显示修复的列数。例如:

call ABC('malaysia,japan,pakistan');

以上存储过程调用正常。它显示了这个结果

| Malaysia   |  Pakistan  |  Japan   |
  16:53:11     13:53:11     17:53:11    

当我用2个国家/地区调用存储过程ABC时,它将显示3列,其中包含空值而不是传递String的国家/地区。像这样:

 call ABC('malaysia,pakistan');

它会显示以下结果:

| Malaysia   |  Pakistan  |  Japan  |
  16:53:11      13:53:11     null        

我想要的是,使存储过程只显示仅由存储过程ABC调用的数据透视列。如果我使用它,它应该是这样的:

call ABC('malaysia,pakistan');

我希望结果如下:

| Malaysia   |  Pakistan  |
  16:53:11      13:53:11      

以下是存储过程的完整代码。任何帮助表示赞赏。

CREATE DEFINER=`root`@`localhost` PROCEDURE `ABC`(fullstr varchar(50))
BEGIN
  DECLARE a INT Default 0 ;
  DECLARE str VARCHAR(255);
DELETE FROM country2;
  SET  @num := 0;
  simple_loop: LOOP
     SET a=a+1;
     SET str=SPLIT_STR(fullstr,",",a);
     IF str='' THEN
        LEAVE simple_loop;
     END IF;
     #Inserts into temp table here with str going into the row
     insert into country2(countryname) values (str);
END LOOP simple_loop;

UPDATE country2 
SET countryid = @num:=(@num + 1);
ALTER TABLE country2 AUTO_INCREMENT =1;

SELECT 
MAX(IF(country2.countryname = 'malaysia',
    ADDTIME(TIME(UTC_TIMESTAMP()), country.UTC),
    NULL)) AS 'malaysia',
MAX(IF(country2.countryname = 'pakistan',
    ADDTIME(TIME(UTC_TIMESTAMP()), country.UTC),
    NULL)) AS 'pakistan',
MAX(IF(country2.countryname = 'japan',
    ADDTIME(TIME(UTC_TIMESTAMP()), country.UTC),
    NULL)) AS 'japan'
FROM
country
    JOIN
country2 ON country.countryname = country2.countryname;
END

**注意 - 只有TABLE国家/地区有UTC数据。而TABLE country2只有一个TEMP表来存储国家名称(来自存储过程参数)。

1 个答案:

答案 0 :(得分:0)

"动态"的完整代码在my pivot blog中找到了旋转。它是一个存储过程,首先发现所需的列名,然后构造SELECT语句并执行它。

这可能会让你得到你想要的东西:

CALL Pivot('country', '', 'countryname', 'UTC', '', '');

实际上,可能需要进行一些小调整(如博客中所讨论的)以摆脱SUM,这似乎是您不需要的。