|  | Posted by nina297 on 06/29/07 13:00 
On Jun 28, 4:32 pm, Erland Sommarskog <esq...@sommarskog.se> wrote:> nina297 (nina.childr...@ssa.gov) writes:
 > > I've written this query:
 >
 > > select distinct topics, questions, answer
 > > from topics AS A, QuesNans AS B
 > > where A.topicid = B.topicid
 > > order by a.topics
 >
 > > The results are:
 > > Topic              Questions            Answers
 > > Topic Four          Question 1     Answer to question 1
 > > Topic One          Quesstion 2     Answer to question 2
 > > Topic One          Question 1     Answer to question 1
 > > Topic Three     Question 1     Answer to question 1
 > > Topic Two          Question 2     Answer to question 2
 >
 > > How do I get one topic listed but all of the questions that go with
 > > that topic?
 >
 > So you get something like:
 >
 >    Topic       Q1      A1    Q2   A2  ....
 >    T Four      Quest1  Ans1
 >    T One       Quest1  Ans2  Quest2 Ans2
 >    ....
 >
 > If you know the maximum number of question per topics, you can do:
 >
 >    SELECT A.Topic,
 >           Q1 = MIN (CASE n.n WHEN 1 THEN B.Questions END),
 >           A1 = MIN (CASE n.n WHEN 1 THEN B.Answers END),
 >           Q2 = MIN (CASE n.n WHEN 2 THEN B.Questions END),
 >           A2 = MIN (CASE n.n WHEN 2 THEN B.Answers END),
 >           ...
 >           Q5 = MIN (CASE n WHEN 5 THEN B.Questions END),
 >           A5 = MIN (CASE n WHEN 5 THEN B.Answers END)
 >    FROM   Topics AS A
 >    JOIN   QuesNans AS B ON A.topicid = B.topicid
 >    CROSS  JOIN (SELECT 1 AS n UNION ALL
 >                 SELECT 2 UNION ALL
 >                 SELECT 3 UNION ALL
 >                 SELECT 4 UNION ALL
 >                 SELECT 5) AS n
 >    GROUP BY A.Topic
 >
 > This is a crosstab query. There are two "tricks". The first is the
 > derived table that generates the numbers 1 to 5. This is a query within
 > the query, which is a very useful technique, because the optimizer is
 > very good at recasting computation order for better performance. The
 > other is the MIN(CASE. The MIN here serves to get all one row, but the
 > MIN only sees one value. In fact MAX would work just as well.
 >
 > If you cannot assume the maxmim number of questions per topic, you
 > need to build the query dynamically, which is quite an increase in
 > complexity. The third party tool RAC, at www4sql.rac.net is popular
 > for this.
 >
 > --
 > Erland Sommarskog, SQL Server MVP, esq...@sommarskog.se
 >
 > Books Online for SQL Server 2005 athttp://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books...
 > Books Online for SQL Server 2000 athttp://www.microsoft.com/sql/prodinfo/previousversions/books.mspx- Hide quoted text -
 >
 > - Show quoted text -
 
 Thanks so much for your help.  I will try both options.
  Navigation: [Reply to this message] |