-1

I have a Store Database with the following tables :

1 - Provider(ProviderID,Name,Country)

2 - Product(ProductID,ProviderID,ProductPrice)

3 - Command(CommandID,ProductID,ProductQuantity,CommandDate)

I made a query that counts the gain by year

SELECT EXTRACT(YEAR FROM COMMAND_DATE) AS year, 
SUM(PRODUCT_PRICE*PRODUCT_QUANTITY) AS gain
FROM PRODUCT JOIN COMMAND ON PRODUCT.PRODUCT_ID=COMMAND.PRODUCT_ID
GROUP BY year
ORDER BY year

This is the output :

enter image description here

Now I want to display the row number just like Oracle, so I used this query :

SET @currentRow = 0;
SELECT @currentRow := @currentRow + 1 AS counter,
EXTRACT(YEAR FROM COMMAND_DATE) AS year,
SUM(PRODUCT_PRICE*PRODUCT_QUANTITY) AS gain
FROM PRODUCT JOIN COMMAND ON PRODUCT.PRODUCT_ID=COMMAND.PRODUCT_ID
GROUP BY year
ORDER BY year

But I don't get what I want

enter image description here

It seems that order is affecting the row number. I want it to start from 1. Ordering by counter is not an option because I need to order by years.

This is how I want it to be :

1 2014 1863
2 2015 889
3 2016 2626
...
Amine Messaoudi
  • 2,141
  • 2
  • 20
  • 37

1 Answers1

1

With group by, you need a subquery:

SELECT (@currentRow := @currentRow + 1) AS counter, y.*
FROM (SELECT EXTRACT(YEAR FROM COMMAND_DATE) AS year,
             SUM(PRODUCT_PRICE*PRODUCT_QUANTITY) AS gain
      FROM PRODUCT JOIN
           COMMAND
           ON PRODUCT.PRODUCT_ID = COMMAND.PRODUCT_ID
      GROUP BY year
      ORDER BY year
     ) y CROSS JOIN
     (SELECT @currentRow := 0) params;

Or, you can use ROW_NUMBER() OVER (ORDER BY YEAR), if you are using MySQL 8+.

Gordon Linoff
  • 1,242,037
  • 58
  • 646
  • 786