I sum value by DATE_FORMAT(date,'%Y-%m-%d')
and id the first 20 rows of data(order by data desc), and sum the remaining value if greater than 20 else 0, the below SQL can used in MySQL version 8.0.18, but failed in 5.7.33, is there any easy way to solve it?
Thanks again for FanoFN's answer
SELECT id,
SUM(CASE WHEN rn = 1 THEN vals ELSE 0 END) AS 'day_1',
SUM(CASE WHEN rn = 2 THEN vals ELSE 0 END) AS 'day_2',
SUM(CASE WHEN rn = 3 THEN vals ELSE 0 END) AS 'day_3',
SUM(CASE WHEN rn = 4 THEN vals ELSE 0 END) AS 'day_4',
SUM(CASE WHEN rn = 5 THEN vals ELSE 0 END) AS 'day_5',
SUM(CASE WHEN rn = 6 THEN vals ELSE 0 END) AS 'day_6',
SUM(CASE WHEN rn = 7 THEN vals ELSE 0 END) AS 'day_7',
SUM(CASE WHEN rn = 8 THEN vals ELSE 0 END) AS 'day_8',
SUM(CASE WHEN rn = 9 THEN vals ELSE 0 END) AS 'day_9',
SUM(CASE WHEN rn = 10 THEN vals ELSE 0 END) AS 'day_10',
SUM(CASE WHEN rn = 11 THEN vals ELSE 0 END) AS 'day_11',
SUM(CASE WHEN rn = 12 THEN vals ELSE 0 END) AS 'day_12',
SUM(CASE WHEN rn = 13 THEN vals ELSE 0 END) AS 'day_13',
SUM(CASE WHEN rn = 14 THEN vals ELSE 0 END) AS 'day_14',
SUM(CASE WHEN rn = 15 THEN vals ELSE 0 END) AS 'day_15',
SUM(CASE WHEN rn = 16 THEN vals ELSE 0 END) AS 'day_16',
SUM(CASE WHEN rn = 17 THEN vals ELSE 0 END) AS 'day_17',
SUM(CASE WHEN rn = 18 THEN vals ELSE 0 END) AS 'day_18',
SUM(CASE WHEN rn = 19 THEN vals ELSE 0 END) AS 'day_19',
SUM(CASE WHEN rn = 20 THEN vals ELSE 0 END) AS 'day_20',
SUM(CASE WHEN rn > 20 THEN vals ELSE 0 END) AS 'day_others'
FROM
(SELECT SUM(value) AS vals, id, DATE_FORMAT(date,'%Y-%m-%d') AS dt,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY dt DESC) AS rn
FROM test_table
GROUP BY id, dt) v
GROUP BY id;