Thread: Odd "problem", not sure if there is a solution ....
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
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.
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
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