Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: SQL/SQL*Plus: How to add numbers to rows?

Re: SQL/SQL*Plus: How to add numbers to rows?

From: Preferred Customer <user_at_msn.com>
Date: 1997/10/27
Message-ID: <01bce338$8a89ed60$6cbe2399@default>

This reply is a bit late but I just re-subscribed and trying to catch up. As another poster noted, this could be done easily with PL/SQL. But since the requirement is to produce it through plain SQL, the query done by Gerard H. Pille below is a very good start, except that it won't return the last column in a sorted order.

I started with that query and continued to produce the required result. If performance is not an issue (small databases) then this will do:

--
Using different data for testing puposes, the tables are:

SQL> SELECT * FROM dept;        SQL> SELECT * FROM emp;

         ID NAME                    DEPT_ID LAST_NAME
----------- ----------------    ----------- ----------------
         20 RESEARCH                     30 JAMES
         10 ACCOUNTING                   10 CLARK
         40 OPERATIONS                   30 MARTIN
         30 SALES                        30 TURNER
                                         30 WARD
4 rows selected.                         10 MILLER
                                         20 SMITH
                                         20 ADAM
                                         30 ALLEN

                                9 rows selected.

[Notice that natural order in either table is unsorted]

Now trying Gerard's method:

SQL> BREAK ON dept_id SKIP 1
SQL> SELECT emp.dept_id,
  2         rownum - deptcnt.counter deptseq,
  3         emp.last_name
  4  FROM emp,
  5       (SELECT dept.id,
  6               COUNT(e.last_name) counter
  7        FROM dept, emp e
  8        WHERE dept.id > e.dept_id (+)
  9        GROUP BY dept.id) deptcnt
 10  WHERE emp.dept_id = deptcnt.id
 11  ORDER BY 1
 12  /

DEPT_ID     DEPTSEQ     LAST_NAME
----------- ----------- --------------------
         10           1 CLARK
                      2 MILLER

         20           1 SMITH
                      2 ADAM

         30           1 JAMES
                      2 ALLEN
                      3 MARTIN
                      4 TURNER
                      5 WARD


9 rows selected.
[LAST_NAME Column is NOT sorted!]

Here's my method, Notice that I used Gerard's Sub-Select for my bb
clause below (Change the hard-coded 15 below for whatever Maximum
Length your "Dept ID" field will have):

SQL> BREAK ON "Department" SKIP 1
SQL> SELECT rownum,
            TO_NUMBER(aa."Dept") "Department",
            aa."RowNum" - bb."Count" "Counter",
            aa."LName" "Last Name"
     FROM

(SELECT RTRIM(SUBSTR(a."temp",1,15)) "Dept",
SUBSTR(a."temp",15) "LName", COUNT(*) "RowNum" FROM (SELECT DISTINCT RPAD(TO_CHAR(dept_id),15) || last_name "temp" FROM emp) a, (SELECT DISTINCT RPAD(TO_CHAR(dept_id),15) || last_name "temp" FROM emp) b WHERE a."temp" >= b."temp" GROUP BY RTRIM(SUBSTR(a."temp",1,15)), SUBSTR(a."temp",15)) aa,
(SELECT dept.id "Dept",
COUNT(emp.last_name) "Count" FROM dept, emp WHERE dept.id > emp.dept_id (+) GROUP BY dept.id) bb WHERE aa."Dept" = bb."Dept" / ROWNUM Department Counter Last Name ----------- ----------- ----------- --------------------- 1 10 1 CLARK 2 2 MILLER 3 20 1 ADAM 4 2 SMITH 5 30 1 ALLEN 6 2 JAMES 7 3 MARTIN 8 4 TURNER 9 5 WARD 9 rows selected. [All Columns are ordered!] Here's one with outer join: SQL> SELECT rownum, TO_NUMBER(aa."Dept") "Department", aa."RowNum" - bb."Count" "Counter", aa."LName" "Last Name" FROM
(SELECT RTRIM(SUBSTR(a."temp",1,15)) "Dept",
SUBSTR(a."temp",15) "LName", COUNT(*) "RowNum" FROM (SELECT DISTINCT RPAD(TO_CHAR(dept.id),15) || emp.last_name "temp" FROM dept,emp WHERE dept.id = emp.dept_id (+)) a, (SELECT DISTINCT RPAD(TO_CHAR(dept.id),15) || emp.last_name "temp" FROM dept,emp WHERE dept.id = emp.dept_id (+)) b WHERE a."temp" >= b."temp" GROUP BY RTRIM(SUBSTR(a."temp",1,15)), SUBSTR(a."temp",15)) aa,
(SELECT dept.id "Dept",
COUNT(emp.last_name) "Count" FROM dept, emp WHERE dept.id > emp.dept_id (+) GROUP BY dept.id) bb WHERE aa."Dept" = bb."Dept" / ROWNUM Department Counter Last Name ----------- ----------- ----------- --------------------- 1 10 1 CLARK 2 2 MILLER 3 20 1 ADAM 4 2 SMITH 5 30 1 ALLEN 6 2 JAMES 7 3 MARTIN 8 4 TURNER 9 5 WARD 10 40 0 10 rows selected. Best regards Amine Tarhini Tarhinia_at_hotmail.com syakobson_at_erols.com wrote in article <877135123.8695_at_dejanews.com>... > Sorry, but your query will not work. Even assuming that SELECT in FROM > clause returns what you expected (which is not the case). Oracle assigns > ROWNUM before applying ORDER BY clause, therefore you can not rely on > ROWNUM being returned in sequence. Now about SELECT in FROM clause. For ... [ Lines deleted for brevity] > and assuming that employee table is already sorted by affiliation (which > is not necessary the case) query would return right results. > > Check query in my reply to Steve. > > Solomon Yakobson. > > > In article <01bcdaf5$69b8e960$7b1340c0_at_pcghp.santens.be>, > "Gerard H. Pille" <ghp_at_santens.be> wrote: > > > > Not bad, it took me an hour. > > > > select emp.affiliation, > > rownum - acnt.counter affseq, > > emp.name > > from employees emp, > > ( select aff.affiliation, count(e.emp_no) counter > > from affiliations aff, employees e > > where aff.affiliation > e.affiliation(+) > > group by aff.affiliation) acnt > > where emp.affiliation = acnt.affiliation > > order by 1 > > > > I wouldn't be to sure about the performance. Let me know if it works for > > your problem or if you have questions. > > -- > > ------------ > > Kind reGards > > \ / | > > X | > > / \ x > > Gerard > > > > Steve Frampton <3srf_at_qlink.queensu.FOOBAR.ca> schreef in artikel > > <6261al$b4q_at_knot.queensu.ca>... > > > [From: header modified to thwart e-mail spam. See .sig for details] > > > > > > I've often wondered about how to accomplish something like this using > > > SQL or SQL*Plus: > > > > > > Affiliation Employee Name > > > ----------- ---------------------------- > > > AAW 1. Joe Smith > > > 2. Henry Lee > > > > > > Teamsters 1. Ralph Johnson > > > 2. Norman Frank > > > 3. Louis Short > > > 4. Jane Doe > > > > > > (I'm talking about the numeric entries). I've tried a myriad of > > > things including sequences (I get a "sequence not allowed here" > > > error), rownum (I get stupid unordered rows because I am joining > > > a number of tables and sorting data such as affilation codes and > > > surnames). > > > > > > How to display numeric lists? I'm looking for an Oracle7 SQL or SQL*Plus > > > solution. > > > > > > Thanks in advance. > > > > > > ----------------< LINUX: The choice of a GNU generation. > > >---------------- > > > Steve Frampton <3srf(@)qlink.queensu.ca> http://qlink.queensu.ca/~3srf > > > ----------- Please remove .FOOBAR from address before replying. ---------- > > > > > -------------------==== Posted via Deja News ====----------------------- > http://www.dejanews.com/ Search, Read, Post to Usenet >
Received on Mon Oct 27 1997 - 00:00:00 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US