Thread: Odd "problem", not sure if there is a solution ....

Odd "problem", not sure if there is a solution ....

From
The Hermit Hacker
Date:
am working up a database for client that contains answers for online
testing...right now, the 'tables' look like:

userid Q1 Q2 Q3 Q4 Q5 Q6 Q7 etc

I want to change it so that its more generic, as:

userid question_no answer

so that instead of one row per user, there are X rows...

the problem is that, somehow, I want the client to be able to view the
results as the first format (ie. one line per user) with it being stored
as multiple lines per user...

Possible?

Marc G. Fournier                   ICQ#7615664               IRC Nick: Scrappy
Systems Administrator @ hub.org
primary: scrappy@hub.org           secondary: scrappy@{freebsd|postgresql}.org


Re: [SQL] Odd "problem", not sure if there is a solution ....

From
secret
Date:
The Hermit Hacker wrote:

> am working up a database for client that contains answers for online
> testing...right now, the 'tables' look like:
>
> userid Q1 Q2 Q3 Q4 Q5 Q6 Q7 etc
>
> I want to change it so that its more generic, as:
>
> userid question_no answer
>
> so that instead of one row per user, there are X rows...
>
> the problem is that, somehow, I want the client to be able to view the
> results as the first format (ie. one line per user) with it being stored
> as multiple lines per user...
>
> Possible?
>
> Marc G. Fournier                   ICQ#7615664               IRC Nick: Scrappy
> Systems Administrator @ hub.org
> primary: scrappy@hub.org           secondary: scrappy@{freebsd|postgresql}.org

    Sure it's possible, if you can live with the constrant that every person must
answer every question... (Else that person will kind of 'disappear' <cough>):

CREATE TABLE q (
    person int4,                -- Person ID#
    q int4,                        -- Question #
    a int4 )                        -- Answer

ftc=> select * from q where q in (1,2);
person|q| a
------+-+--
     1|1| 1
     1|2| 1
     2|1|21
     2|2|22
(4 rows)
SELECT q1.person,
        q1.a,
        q2.a

FROM    q as q1,
        q as q2

WHERE
        q1.person=q2.person
        AND q1.q = 1
        AND q2.q = 2
;
person| a| a
------+--+--
     1| 1| 1
     2|21|22
(2 rows)

    Your probably want to rename "a" to a1 and a2, but you can expand this to N
questions... The performance will suck if your table is pretty big, so I'd arrange
to move things to a history file every so often... Keep in mind people will
disappear if they are missing the answer to any question.

David Secret
MIS Director
Kearney Development Co., Inc.




Re: [SQL] Odd "problem", not sure if there is a solution ....

From
Herouth Maoz
Date:
At 05:46 +0200 on 26/03/1999, The Hermit Hacker wrote:


> am working up a database for client that contains answers for online
> testing...right now, the 'tables' look like:
>
> userid Q1 Q2 Q3 Q4 Q5 Q6 Q7 etc
>
> I want to change it so that its more generic, as:
>
> userid question_no answer
>
> so that instead of one row per user, there are X rows...
>
> the problem is that, somehow, I want the client to be able to view the
> results as the first format (ie. one line per user) with it being stored
> as multiple lines per user...
>
> Possible?

The question is whether you expect your query to return rows in the above
format, where each of the answers is a separate field, or you could settle
for all the answers returned in one text field.

SQL does not provide for queries that return a different number of fields
for each row. What I'd do in such a case is to create an aggregate function
based on text concatenation ('||'), and either use the result as is or
split it on the client side through known delimiters.

Another approach is to query this table separately and do the grouping on
the client side.

I've used the first approach in one of my projects, if you are interested
in the solution.

Herouth

--
Herouth Maoz, Internet developer.
Open University of Israel - Telem project
http://telem.openu.ac.il/~herutma




Re: [SQL] Odd "problem", not sure if there is a solution ....

From
Chairudin Sentosa
Date:
secret wrote:

> The Hermit Hacker wrote:
>
> > am working up a database for client that contains answers for online
> > testing...right now, the 'tables' look like:
> >
> > userid Q1 Q2 Q3 Q4 Q5 Q6 Q7 etc
> >
> > I want to change it so that its more generic, as:
> >
> > userid question_no answer
> >
> > so that instead of one row per user, there are X rows...
> >
> > the problem is that, somehow, I want the client to be able to view the
> > results as the first format (ie. one line per user) with it being stored
> > as multiple lines per user...
> >
> > Possible?
> >
> > Marc G. Fournier                   ICQ#7615664               IRC Nick: Scrappy
> > Systems Administrator @ hub.org
> > primary: scrappy@hub.org           secondary: scrappy@{freebsd|postgresql}.org
>
>     Sure it's possible, if you can live with the constrant that every person must
> answer every question... (Else that person will kind of 'disappear' <cough>):
>
> CREATE TABLE q (
>     person int4,                -- Person ID#
>     q int4,                        -- Question #
>     a int4 )                        -- Answer
>
> ftc=> select * from q where q in (1,2);
> person|q| a
> ------+-+--
>      1|1| 1
>      1|2| 1
>      2|1|21
>      2|2|22
> (4 rows)
> SELECT q1.person,
>         q1.a,
>         q2.a
>
> FROM    q as q1,
>         q as q2
>
> WHERE
>         q1.person=q2.person
>         AND q1.q = 1
>         AND q2.q = 2
> ;
> person| a| a
> ------+--+--
>      1| 1| 1
>      2|21|22
> (2 rows)
>
>     Your probably want to rename "a" to a1 and a2, but you can expand this to N
> questions... The performance will suck if your table is pretty big, so I'd arrange
> to move things to a history file every so often... Keep in mind people will
> disappear if they are missing the answer to any question.

Hi David,

I like your solution.
However, is there a better way to remove the constraint?

Thanks

Regards,
Chai