0

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;
Elsa
  • 1
  • 1
  • 8
  • 27
  • 1
    MySQL 5.7 is reaching end of life next year. It's worth considering upgrading soon. – The Impaler Feb 11 '22 at 03:16
  • Without `ROW_NUMBER()` you have to use a `@variable` that you increment in the subquery. – Barmar Feb 11 '22 at 03:24
  • The old school solution for MySQL 5.x was to use "variables" (search for the @ sign), that are now disabled in 8.x. – The Impaler Feb 11 '22 at 03:24
  • @TheImpaler end of life next year? If we don't upgrade, what will happen? Do you have any authoritative article, I want to show my company – Elsa Feb 11 '22 at 03:32
  • @QueenElsa See http://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf (page 28), https://en.wikipedia.org/wiki/MySQL#Release_history and https://endoflife.software/applications/databases/mysql. There will probbly security patches after October 2023, but you cannot count on that to happen. – The Impaler Feb 11 '22 at 13:51
  • Thanks so so so much for your answer!!!!@TheImpaler – Elsa Mar 14 '22 at 06:30

0 Answers0