Solved

select rows into a list using DB2 SQL

Posted on 2009-04-09
12
1,028 Views
Last Modified: 2012-08-13
I have the following rows.  I like a simple select to get the result like 10, 20, 30, 40, 90 ...
Thanks!
emp_no
10
20
30
40
90
0
Comment
Question by:ewang1205
  • 5
  • 4
  • 2
  • +1
12 Comments
 
LVL 18

Expert Comment

by:daveslash
ID: 24108343

Are you simply looking to put the results in ascending order?

How about this?


select m.emp_no

from   MyTable m

order by m.emp_no

Open in new window

0
 
LVL 45

Expert Comment

by:Kdo
ID: 24108955
Hi Dave,

Betcha this is a columns to rows issue.  :)



Hi Ewang,

Are you looking to put all of the items on a single line?


Kent
0
 

Author Comment

by:ewang1205
ID: 24133550
Yes, I like to  put all of the items (rows) on a single line.  Basically, I like to put all the rows (single column) into one row seperated by comma.  Thanks.
0
 
LVL 37

Assisted Solution

by:momi_sabag
momi_sabag earned 400 total points
ID: 24135161
0
 

Author Comment

by:ewang1205
ID: 24140261
I looked at http://www.experts-exchange.com/Database/DB2/Q_24110747.html .  I see the following.  But, I cannot finish the following sample code.  Maybe the author was trying to write a function, but my DB2 skill is not as advanced.  Please help.

--
--  Create a test table and sample data
--
CREATE TABLE t (
  id integer not null generated by default as identity,
  st varchar (2));
INSERT INTO t (st) VALUES ('CA');
INSERT INTO t (st) VALUES ('NJ');
INSERT INTO t (st) VALUES ('NY');
INSERT INTO t (st) VALUES ('PA');
--
--  Build the string
--
with tt (id, v, current, final)
as
(
 
  SELECT id, id, st, cast (st as varchar (100))
  from t t1
 
  union all
 
  select t1.id, t2.id, t1.st, cast (t2.final || ',' || t1.st as varchar (100))
  from t t1, tt t2
  where t2.id < t1.id
  and locate (t1.st, t2.final) = 0
)
select * from tt;
Open in New Window Select All
0
 
LVL 45

Expert Comment

by:Kdo
ID: 24140335
Hi ewang,

The SQL start with the word 'with' actually builds the string.  The CREATE TABLE and INSERT statements generate a test case to demonstrate the recursive SQL.

Post your table definition (at least the relevent parts) and your rules for selecting items to be on the same line.  I'll be glad to put the SQL together for you.


Kent
0
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 

Author Comment

by:ewang1205
ID: 24140389
Here is the table:

CREATE TABLE t (
  id integer not null generated by default as identity,
  st varchar (2));
INSERT INTO t (st) VALUES ('CA');
INSERT INTO t (st) VALUES ('NJ');
INSERT INTO t (st) VALUES ('NY');
INSERT INTO t (st) VALUES ('PA');
.
How to have a SQL or stored procedure to have the following output?  Can the recursive  SQL be part of the stored procedure?
CA, NJ, NY, PA
0
 
LVL 45

Expert Comment

by:Kdo
ID: 24140479
Hi ewang,

I'm confused.  That's the table that I used in the example.

So what's the question?


Kent
0
 

Author Comment

by:ewang1205
ID: 24140507
The problem is the following select returns more rows than I needed.  Another problem is if can I put the recursive SELECT into a store procedure?  Thanks.
select * from tt;
0
 
LVL 45

Assisted Solution

by:Kdo
Kdo earned 100 total points
ID: 24140558

The recursive sql generates all the string combinations of the selected elements.  You have to select the desired string.

You can also do this in the stored procedure.  If you're more comfortable writing procedures, select the desired rows and build the string in the procedure.


Kent
0
 

Author Comment

by:ewang1205
ID: 24143040
Here is the stored procedure I wrote using table t.  Works fine.  The only problem is to fin the last row and then LEAVE fetch_loop.  How to find the last row ?  

CREATE PROCEDURE LOOP_UNTIL_last_row(OUT tstring  vARCHAR(1000)  )
   LANGUAGE SQL
   BEGIN
      DECLARE v_st VARCHAR(15);
--declare v_counter  integer default 0;
declare v_tstring VARCHAR(1000) default '';
      DECLARE c1 CURSOR FOR
         SELECT st FROM t;
      --DECLARE EXIT HANDLER FOR NOT FOUND
        -- SET counter = -1;
      OPEN c1;
      fetch_loop:
      LOOP
        FETCH c1 INTO v_st;
        IF v_st = 'NY' THEN
           LEAVE fetch_loop;
        END IF;
      --  SET v_counter = v_counter + 1;
set v_tstring = v_tstring ||','||v_st;
      END LOOP fetch_loop;
      SET tstring= substr(v_tstring,2);
      CLOSE c1;
   END
0
 
LVL 37

Accepted Solution

by:
momi_sabag earned 400 total points
ID: 24145100
after you fetch the last row, the sqlcode will be 100, so you can try

CREATE PROCEDURE LOOP_UNTIL_last_row(OUT tstring  vARCHAR(1000)  )
   LANGUAGE SQL
   BEGIN
      DECLARE v_st VARCHAR(15);
--declare v_counter  integer default 0;
declare v_tstring VARCHAR(1000) default '';
      DECLARE c1 CURSOR FOR
         SELECT st FROM t;
      --DECLARE EXIT HANDLER FOR NOT FOUND
        -- SET counter = -1;
      OPEN c1;
      fetch_loop:
      LOOP
        FETCH c1 INTO v_st;
        IF sqlcode = 100 THEN
           LEAVE fetch_loop;
        END IF;
      --  SET v_counter = v_counter + 1;
set v_tstring = v_tstring ||','||v_st;
      END LOOP fetch_loop;
      SET tstring= substr(v_tstring,2);
      CLOSE c1;
   END
0

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

November 2009 Recently, a question came up in the DB2 forum regarding the date format in DB2 UDB for AS/400.  Apparently in UDB LUW (Linux/Unix/Windows), the date format is a system-wide setting, and is not controlled at the session level.  I'm n…
Recursive SQL in UDB/LUW (it really isn't that hard to do) Recursive SQL is most often used to convert columns to rows or rows to columns.  A previous article described the process of converting rows to columns.  This article will build off of th…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now