Есть мысли об этом вызове TSQL? - PullRequest
0 голосов
/ 11 ноября 2010

У меня была следующая физическая таблица результата «анкеты». Это не отношение как способ хранения результата.

Как видите, [84273x1x1] и [84273x1x2] представляют собой выпадающий список, в котором возвращается код, а [84273x1x4] - свободный текст.

UserID; UserName; Email; [84273x1x1]; [84273x1x2]; [84273x1x4]; [84273x2x5]; [84273x2x6]; [84273x2x7];
1; "Name1"; "name1@email.com"; "A101", "A203", "Test answer bla bla"; "A102", "A201", "Test answer bla bla"
2; "Name2"; "name2@email.com"; "A102", "A202", "This is my comment"; "A101", "A203", "This is my comment";

То, что я обнаружил, что: [84273x1x1] соответствует:

84273 = SurveyID
1 = PageID
1 = QuestionID

В таблице ответов оно имеет следующее:

QID; Code; Answer;
1; A101; 1
1; A102; 2
1; A103; 3
2; A200; 0
2; A201; 1
2; A202; 2
2; A203; 3
5; A101; 1
5; A102; 2
5; A103; 3
6; A200; 0
6; A201; 1
6; A202; 2
6; A203; 3

On the question table:
QID; QuestionType; Title;
1; "DropDownList"; "How do you rate of GROUP-Q1";
2; "DropDownList"; "How do you rate of GROUP-Q1";
3; "Text"; "Comment of Q1";
4; "DropDownList"; "How do you rate of GROUP-Q2";
5; "DropDownList"; "How do you rate of GROUP-Q2";
6; "Text"; "Comment of GROUP-Q2";

Результат, которого я хотел бы достичь, - это поворот:

UserID; Name; Email; Title; [Question1], [Question2]; [Question3]
1; "Name1"; "name1@email.com"; "GROUP-Q1"; "1"; "3"; "Test answer bla bla"; 
1; "Name1"; "name1@email.com"; "GROUP-Q2"; "2"; "1"; "Test answer bla bla"; 
2; "Name2"; "name2@email.com"; "GROUP-Q1"; "2"; "2"; "Test answer bla bla"; 
2; "Name2"; "name2@email.com"; "GROUP-Q2"; "1"; "3"; "Test answer bla bla"; 

Поскольку это нужно сделать в TSQL - 2005. Когда я посмотрел на это, моей первой мыслью будет, что это должно быть в Курсоре.

Есть мысли, ребята?

Спасибо

1 Ответ

1 голос
/ 11 ноября 2010

Как насчет примерно так:

Select P.UserId, P.Username, P.Email
    , 'GROUP-Q1'
    , A1.Answer As Question1
    , A2.Answer As Question2
    , P.[84273x1x4] As Question3
From People As P
    Left Join Answers As A1
        On A1.Code = P.[84273x1x1]
            And A1.QID = 1
    Left Join Answers As A2
        On A2.Code = P.[84273x1x2]
            And A2.QID = 2
Union All
Select P.UserId, P.Username, P.Email
    , 'GROUP-Q2'
    , A1.Answer As Question1
    , A2.Answer As Question2
    , P.[84273x1x7] As Question3
From People As P
    Left Join Answers As A1
        On A1.Code = P.[84273x1x5]
            And A1.QID = 5
    Left Join Answers As A2
        On A2.Code = P.[84273x1x6]
            And A2.QID = 6

Вот еще одно «более» динамическое решение (требуется SQL Server 2005+):

;With UserRawAnswers As
    (
    Select UserId, 1 As QuestionID, [84273x1x1] As Answer From People
    Union All Select UserId, 2, [84273x1x2] From People
    Union All Select UserId, 3, [84273x1x4] From People
    Union All Select UserId, 5, [84273x1x5] From People
    Union All Select UserId, 6, [84273x1x6] From People
    Union All Select UserId, 6, [84273x1x7] From People
    )
    , UserAnswers As
    (
    Select UA.UserId
        , Right(Q.Title) As Title
        , Coalesce(DropListAnswers.Answer, UA.Answer) As Answer
    From UserRawAnswers As UA
        Join Questions
            On Questions.QID = UA.QID
        Left Join (Answer As DropListAnswers
            Join Questions As DropListQuestions
                On DropListQuestions.QID = DropListAnswers.QID
                    And DropListQuestions.QuestionType = 'DropDownList')
            On DropListAnswers.Code = UA.Answer
    )
Select P.UserID, P.Name, P.Email
    , UA.Title
    , Min( Case When UA.QuestionID = 1 Then UA.Answer End ) As Question1
    , Min( Case When UA.QuestionID = 2 Then UA.Answer End ) As Question2
    , Min( Case When UA.QuestionID = 3 Then UA.Answer End ) As Question3
From UserAnswers As UA
    Join People As P
        On P.UserID = UA.UserId
Group By P.UserID, P.Name, P.Email, UA.Title

Имейте в виду, что по сути язык SQL не предназначен для работы с динамической схемой (то есть динамически генерируемыми столбцами). Единственный способ построить динамическую схему - это использовать динамический SQL, и если вы достигнете этой точки, вы также можете сделать это на среднем уровне или в инструменте отчетности. Кроме того, денормализованная структура действительно затрудняет анализ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...