Как преобразовать строки данных в столбцы? - PullRequest
1 голос
/ 15 января 2010

У меня есть таблица tblUser, с колонками

userId,firstName,LastName,Mobile,.......,QuestionID

У меня есть другая таблица с именем tblResults, с этими столбцами

questionID,Question,choiceID,choice,.........

tblUser
-----------------------------------------------------------------------------
userID -  FirstName- LstName -Mobile  ...     ...     ... -  QuestionID -  ChiceID
-----------------------------------------------------------------------------
001   -   xx     -     yy   -   03212          -                   01        01 
001   -   xx     -     yy   -   03212          -                   02        02 
002   -   xxx     -    yyy  -   03425         -                    01        02 
002   -   xxx     -    yyy  -   03425        -                     02        01  
003   -   xxxx    -    yyyy  -  03429         -                    03        02 
003   -   xxxx   -     yyyy  -  03429          -                   03        01 
------------------------------------------------------------------------------

tblResults
---------------------------------------------------------------------
QuestionID   Question       ChoiceID       Chice    ....     ....            
---------------------------------------------------------------------
01        -    **Are you**   -  01   -   Male
01        -    **Areyou**    -  02    -  Female
02        -    **From**     -   01   -   xxxxx
02        -    **FROM**     -   02    -  yyyyy  
---------------------------------------------------------------------

Я хочу получить результат, показанный в следующей таблице

-------------------------------------------------------------------------------
UserID FirstName LastName  Mobile  **Areyou**   **From**
-------------------------------------------------------------------------------
001    -   xx     -  yy     -   03212  -  Male  -  yyyyy
002    -   xxx    -  yyy    -   03425   - Female - xxxxx
003    -   xxxx   -  yyyy   -   03429  -  Female -  xxxxx        

Ответы [ 3 ]

0 голосов
/ 15 января 2010

По сути, мы можем создать таблицу t (UserID, ChoiceID) для каждого вопроса, а затем внутренне объединить все эти таблицы. затем мы получили (UserID, ChoiceID_for_Question_1, ChoiceID_for_Question_2, ...). добавив обратно пользовательскую информацию, мы получили желаемый результат.


select t1.UserID, t1.FirstName, t1.LastName, t1.Mobile, t1.Choice, t2.Choice
from 
  (select u.UserID, u.FirstName, u.LastName, u.Mobile, r.Choice
  from tblUser u, tblResults r 
  where u.questionID = '01' and u.QuestionID=r.QuestionID and u.ChoiceID = r.ChoiceID) t1
inner join 
  (select u.UserID UserID, r.Choice
  from tblUser u, tblResults r 
  where u.questionID = '02' and u.QuestionID=r.QuestionID and u.ChoiceID = r.ChoiceID) t2
/* 
inner join
  (...) t3
*/
on t1.UserID = t2.UserID /* and t2.UserID = t3.UserID */

0 голосов
/ 16 августа 2012

Вы можете использовать PIVOT для получения желаемых результатов.Есть два способа: статическая сводка, с помощью которой вы жестко кодируете столбцы, или динамическая сводка, которая получает список столбцов во время выполнения.

статическая сводка: (см. SQL Fiddle с демоверсией )

create table tblUser
(
    userid int,
    fname varchar(10),
    lname varchar(10),
    mobile int,
    questionid int,
    choiceid int
) 
insert into tblUser values (001, 'xx', 'yy', 03212, 01, 01)
insert into tblUser values (001, 'xx', 'yy', 03212, 02, 02)
insert into tblUser values (002, 'xxx', 'yyy', 03425, 01, 02)
insert into tblUser values (002, 'xxx', 'yyy', 03425, 02, 01)
insert into tblUser values (003, 'xxxx', 'yyyy', 03429, 03, 02)
insert into tblUser values (003, 'xxxx', 'yyyy', 03429, 03, 01)

create table tblResults
(
    questionid int,
    question varchar(10),
    choiceid int,
    choice varchar(10)
)
insert into tblresults values (01, 'Are you', 01, 'Male')
insert into tblresults values (01, 'Are you', 02, 'Female')
insert into tblresults values (02, 'From', 01, 'xxxxx')
insert into tblresults values (02, 'From', 02, 'yyyyy')

select *
from 
(
    select u.userid,
        u.fname,
        u.lname,
        u.mobile,
        r.question,
        r.choice
    from tbluser u
    left join tblresults r
        on u.questionid = r.questionid
        and u.choiceid = r.choiceid
) x
pivot
(
    min(choice)
    for question in([are you], [from])
) p

Динамическая опора: (См. SQL Fiddle с демо )

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
            FROM tblresults c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
            (
                select u.userid,
                    u.fname,
                    u.lname,
                    u.mobile,
                    r.question,
                    r.choice
                from tbluser u
                left join tblresults r
                    on u.questionid = r.questionid
                    and u.choiceid = r.choiceid
           ) x
            pivot 
            (
                min(choice)
                for question in (' + @cols + ')
            ) p '


execute(@query)

Оба будутдают такие же результаты.

0 голосов
/ 15 января 2010

Вы получаете уникальных пользователей с соответствующими вариантами ответов для каждого вопроса и включаете в таблицу tblResults один раз для каждого вопроса:

select
  u.userID, u.FirstName, u.LastName, u.Mobile,
  q1.Choice as Areyou,
  q2.Choice as [From]
from (
  select userID, FirstName, LastName, Mobile,
  sum(case QuestionId when '01' then ChoiseId else 0 end) as ChoiseId1,
  sum(case QuestionId when '02' then ChoiseId else 0 end) as ChoiseId2
  from tblUser
) as u
inner join tblResults as q1 on q1.QuestionID = '01' and q1.ChoiseID = u.ChoiseId1
inner join tblResults as q2 on q2.QuestionID = '02' and q2.ChoiseID = u.ChoiseId2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...