Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Data Bases > Oracle Miscellaneous > Re: Anti-pivot
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 3 of 6 Topic 6847 of 7280
Post > Topic >>

Re: Anti-pivot

by Mark D Powell <Mark.Powell@[EMAIL PROTECTED] > Apr 21, 2008 at 10:23 AM

On Apr 21, 10:18=A0am, "rogergor...@[EMAIL PROTECTED]
" <rogergor...@[EMAIL PROTECTED]
>
wrote:
> On Apr 21, 7:44=A0am, Mountain...@[EMAIL PROTECTED]
 wrote:
>
>
>
>
>
> > Hello,
>
> > I have a table which has 3 columns: user id, key and value. A user may
> > only have one instance of a given key. However, the key may have
> > multiple values; these are held as comma-separated values within the
> > value column (there can be any number of these values in the row). An
> > example:
>
> > User_id =A0Key =A0 =A0 Value
> > ------- =A0------ =A0-----
> > 1 =A0 =A0 =A0 =A0MY_KEY =A01
> > 2 =A0 =A0 =A0 =A0MY_KEY =A01,2,3
>
> > Firstly: yes, I know this is *extremely* hideous database design; I
> > cringed when I saw it. Unfortunately, the design is set in stone and I
> > not able to change it.
>
> > The question is, is there any way of getting out the values with one
> > row
> > for each in SQL*Plus? So, for example, getting the values for key
> > MY_KEY
> > for user_id 2 would produce:
>
> > User_id =A0Key =A0 =A0 Value
> > ------- =A0------ =A0-----
> > 2 =A0 =A0 =A0 =A0MY_KEY =A01
> > 2 =A0 =A0 =A0 =A0MY_KEY =A02
> > 2 =A0 =A0 =A0 =A0MY_KEY =A03
>
> > I've had a quick look at pivoting queries but they seem to be doing
> > the
> > opposite of what I'm doing here.
>
> > Version: 10.2.0.1.0
>
> > Many thanks,
>
> > Oaf
>
> You might want to look into REGEXP in Oracle 10G, or if that's too
> uncomfortable, create a view, using some Pl/SQL to populate the table.
>
> Either way, that datamodel is going to be a huge pain in the *** to
> work with and will only cause more problems as it won't scale.
>
> Roger Gorden- Hide quoted text -
>
> - Show quoted text -

Well here is one possible technique to extract the data from a
column.  Warning I have tested beyound this simple query.

UT1 > drop table t;

Table dropped.

UT1 > create table t (fld1 number, fld2 varchar2(10), fld3
varchar2(20) );

Table created.

UT1 > insert into t values (1,'one','1');

1 row created.

UT1 > insert into t values (2,'one','1,2,3,4');

1 row created.

UT1 > insert into t values (3,'two','1,2');

1 row created.

UT1 > insert into t values (4,'one','11,21,313,414');

1 row created.

UT1 > col fld2  format a4
UT1 > col fld3  format a13
UT1 > col fld4  format a4
UT1 > col fld5  format a4
UT1 > col fld6  format a4
UT1 > col fld7  format a4
UT1 > select fld1, fld2, fld3,
  2         case when instr(fld3,',',1,1) > 0
  3              then substr(fld3,1,instr(fld3,',',1) - 1)
  4              else fld3
  5         end as fld4,
  6         case when instr(fld3,',',1,1) > 0
  7              then substr(fld3,instr(fld3,',',1,1) + 1,
  8                   case when instr(fld3,',',1,2) > 0
  9                        then instr(fld3,',',1,2) - 1 -
instr(fld3,',',1,1)
 10                        else length(fld3)
 11                   end )
 12              else NULL
 13              end as fld5,
 14         case when instr(fld3,',',1,2) > 0
 15              then substr(fld3,instr(fld3,',',1,2) + 1,
 16                   case when instr(fld3,',',1,3) > 0
 17                        then length(fld3) - instr(fld3,',',1,3)
 18                        else length(fld3)
 19                   end )
 20              else NULL
 21              end as fld6,
 22          case when instr(fld3,',',1,3) > 0
 23               then substr(fld3,instr(fld3,',',1,3) +
1,length(fld3))
 24               else NULL
 25               end as fld7
 26  from t
 27  order by fld1, fld2
 28  /

      FLD1 FLD2 FLD3          FLD4 FLD5 FLD6 FLD7
---------- ---- ------------- ---- ---- ---- ----
         1 one  1             1
         2 one  1,2,3,4       1    2    3    4
         3 two  1,2           1    2
         4 one  11,21,313,414 11   21   313  414


The MERGE statement can be used to unpivot data.  With 11g Oracle
provides a pivot and unpivot statement.

HTH -- Mark D Powell --
 




 6 Posts in Topic:
Anti-pivot
MountainOaf@[EMAIL PROTEC  2008-04-21 04:44:30 
Re: Anti-pivot
"rogergorden@[EMAIL   2008-04-21 07:18:59 
Re: Anti-pivot
Mark D Powell <Mark.Po  2008-04-21 10:23:51 
Re: Anti-pivot
Urs Metzger <urs@[EMAI  2008-04-21 22:23:14 
Re: Anti-pivot
MountainOaf@[EMAIL PROTEC  2008-04-22 02:00:46 
Re: Anti-pivot
Mark D Powell <Mark.Po  2008-04-22 07:53:06 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Wed Dec 3 0:19:56 CST 2008.