prod xx xx ... 'prod 1' 'prod 2' 'prod 1' 'prod 3' 'Prod 4' ...... #### prod count prod 1 10 prod 2 15 ...... #### use DBI; my $dbh = connect(....); my $pvt_col = 'prod'; my $count = 'count'; my $table = 'prod' my $stmt = q{ SELECT CONCAT( '(SUM(CASE WHEN }. $pvt_col. q{ IS NULL THEN Count ELSE 0 END)) AS Total, ', GROUP_CONCAT(DISTINCT CONCAT( '(SUM(CASE WHEN }. $pvt_col. q{ = ''', }. $pvt_col. q{, ''' THEN ', }. $count. q{, ' ELSE 0 END)) AS `', }. $pvt_col. q{, '`' ) ) ) FROM ( SELECT }. $pvt_col. q{, count(*) AS }. $count. q{ FROM }. $table. q{ GROUP BY }. $pvt_col. q{ WITH ROLLUP) as temptbl;}; my $sth = $dbh->prepare($stmt); $sth->execute(); my $tmp; while ( ($tmp) = $sth->fetchrow_array() ) { print"$tmp\n"; last; } #### (SUM(CASE WHEN prod IS NULL THEN Count ELSE 0 END)) AS Total, (SUM(CASE WHEN prod = 'prod1' THEN 10 ELSE 0 END)) AS `prod1`, (SUM(CASE WHEN prod = 'prod2' THEN 15 ELSE 0 END)) AS `prod2`, (SUM(CASE WHEN prod = 'prod3' THEN 1 ELSE 0 END)) AS `prod3`, ..... #### my $statement = q{ SELECT }. $tmp. q{ FROM( SELECT }. $pvt_col. q{, count(*) AS }. $count. q{ FROM }. $table. q{ GROUP BY }. $pvt_col. q{ WITH ROLLUP ) as temptbl;}; $sth = $dbh->prepare($statement); .... #### SELECT ( (SUM(CASE WHEN prod IS NULL THEN Count ELSE 0 END)) AS Total, (SUM(CASE WHEN prod = 'prod1' THEN 10 ELSE 0 END)) AS `prod1`, (SUM(CASE WHEN prod = 'prod2' THEN 15 ELSE 0 END)) AS `prod2`, (SUM(CASE WHEN prod = ..... ... FROM( SELECT prod, count(*) AS Count FROM prod GROUP BY prod WITH ROLLUP) as temptbl;