如何使存储过程显示动态透视列?当前查询只能显示修复的列数。例如:
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表来存储国家名称(来自存储过程参数)。
答案 0 :(得分:0)
"动态"的完整代码在my pivot blog中找到了旋转。它是一个存储过程,首先发现所需的列名,然后构造SELECT
语句并执行它。
这可能会让你得到你想要的东西:
CALL Pivot('country', '', 'countryname', 'UTC', '', '');
实际上,可能需要进行一些小调整(如博客中所讨论的)以摆脱SUM
,这似乎是您不需要的。