需要首先确定结果中每一行的间隔。由于表中没有这样的值。可能会形成一个包含UNION ALL 运算符的子查询。然后应该构造一个动态查询,考虑到type 列的不同值可能会更改。因此,您可以使用以下语句:
SET SESSION group_concat_max_len = 4096;
SET @sql = NULL;
SELECT GROUP_CONCAT(
CONCAT('CONCAT(ROUND( 100 * SUM( CASE WHEN amount BETWEEN THEN type = ''',type,''' END)/COUNT(*), 2),"%") AS ',type )
)
INTO @sql
FROM ( SELECT DISTINCT type FROM t) tt;
SELECT GROUP_CONCAT(
CONCAT(
'SELECT "',REPLACE(intrval,' AND ','-'),'" AS "Amount Bins", ',
REPLACE( @sql, 'BETWEEN THEN',
CONCAT('BETWEEN ',intrval,' THEN' )),
', CONCAT(ROUND( 100 * SUM( CASE WHEN amount BETWEEN ',intrval,' THEN 1 END)/COUNT(*), 2),"%") AS "All Types"',
' FROM t '
)
SEPARATOR ' UNION ALL '
)
INTO @sql
FROM (SELECT @i := @i + 1 AS i,
CONCAT(@i * ((max_amount - min_amount) / 4) + min_amount,' AND ',
(@i + 1) * ((max_amount - min_amount) / 4) + min_amount ) AS intrval
FROM information_schema.tables i
JOIN (SELECT @i := -1) AS ii
JOIN (SELECT MIN(amount) AS min_amount, MAX(amount) AS max_amount
FROM t ) AS t_agg
WHERE @i < 3) i;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
结果是
Amount Bins A B C D All Types
----------- ------ ------ ------ ------ ---------
500-675 12.50% 12.50% 0.00% 0.00% 25.00%
675-850 12.50% 0.00% 12.50% 0.00% 25.00%
850-1025 12.50% 0.00% 0.00% 12.50% 25.00%
1025-1200 0.00% 25.00% 0.00% 0.00% 25.00%
Demo