Halim B. wrote:

This is an example of what I want. I have a table called "Sales" with two fields ItemDescription and totalsales. Sale

ItemDescription       TotalSales
Coke                  $500.00
Water                 $800.00
Pepsi                 $300.00
Orange Juice          $600.00

I would like to get the following results

ItemDescription       TotalSales   Rank
Coke                  $500.00      3
Water                 $800.00      1
Pepsi                 $300.00      4
Orange Juice          $600.00      2

Rank column is sorted based on the highest TotalSales. Using ElevateDB database engine I used to run this query

Select *, RunSum(1) from Sales Order by TotalSales Desc.

I am trying to do the same thing with firebird.

Adriano dos Santos Fernandes answers:

You may use ROWNUM-like generic SP procedure, like this one. I do it based on the link sent here.

create sequence rownum_seq!

create or alter procedure rownum
   returns (rowid bigint)
as
begin
   rowid = gen_id(rownum_seq, 1);
   rdb$set_context('USER_TRANSACTION', 'rownum' || rowid, 0);
   suspend;
end!

create or alter procedure rownum_inc (rowid bigint)
   returns (rownum bigint)
as
begin
   rownum = cast(rdb$get_context('USER_TRANSACTION', 'rownum' || rowid) as bigint) + 1;
   rdb$set_context('USER_TRANSACTION', 'rownum' || rowid, rownum);
   suspend;
end!

And use in your queries:

select *
  from (
    select
       (select rownum from rownum_inc(rowid)) rank,
       Sales.*
    from Sales, rownum
    order by TotalSales desc
  )
order by ItemDescription

You don't need the outer select...order by if you can order by TotalSales DESC.

Like this post? Share on: TwitterFacebookEmail


Related Articles


Author

Firebird Community

Published

Category

Gems from Firebird Support list

Tags