2015-10-16 4 views
-1

Мне нужна помощь с помощью сводной таблицы, если это возможно. Не уверен, что это можно сделать. Ниже мой пример. ВопросыSQL Dynamic Pivot Query

enter image description here

Ответы

enter image description here

Пользователь Ответы

enter image description here

Ответ Pivot

enter image description here

Спасибо за любую помощь.

enter image description here

Я приложил скриншот БД результатов с шарнирной работы. Код ниже, как и должен, должен работать, и это работает нормально. Если вы можете посмотреть столбец «Subject has exp ...», мне бы хотелось, чтобы столбец повторялся три раза, заголовок - это вопрос. Но я также хотел бы, чтобы каждый возможный ответ был показан с вопросом.

Еще раз спасибо!

Thansk Again.

Вот пример Кодекса:

DECLARE @columns VARCHAR(MAX) 

SELECT @columns = COALESCE(@columns + ','+QUOTENAME([QuestionText]),QUOTENAME([QuestionText])) 

FROM   SchemaWema.vts_vwSurvey INNER JOIN 

         Question ON SchemaWema.vts_vwSurvey.SurveyID = SchemaWema.vts_vwQuestion.SurveyID 
WHERE SchemaWema.vts_vwSurvey.DecisionSetId = 598 AND SchemaWema.vts_vwSurvey.FormType = 1 

Set @columns = REPLACE(@columns, '[]', '[No Name Given]') 

DECLARE @sql NVARCHAR(MAX)=N' SELECT * FROM 
(

     SELECT  Project.PROJECTNAME, Project.ID, 
         Sites.PROJECTSTUDYSITENUMBER, Sites.PROJECTSTUDYSITENAME, 
         Study.PROJECTSTUDYNAME, Study.PROJECTSTUDYNUMBER, 
         Survey.SurveyID,  Question.QuestionID, Cases.SITEID, Cases.EVENTDATE, 
           Cases.SUBJNO, Cases.EventType, Cases.TriggerEvent, 
           Cases.DecisionSetID, Cases.PanelID, Cases.RECORDSTATUS, 
           Project.PROJECTSPONSOR, VoterAnswers.AnswerID, VoterAnswers.VoterID, 
           VoterAnswers.AnswerText AS FreeTypedAnswers, Voter.VoteDate, Users.SHOWNNAME, Panel.PANELNAME, Sites.COUNTRY, 
           Cases.VERSIONID, cases.CSID, cases.CASENUMBER,Cases.CASEDATEUPDATED AS LASTUPDATED, 
           Cases.DECISIONSETNAME, 
           Question.QuestionText, 
         CASE 
          WHEN 
           CAST(VoterAnswers.AnswerText AS VARCHAR(MAX)) IS NULL OR CAST(VoterAnswers.AnswerText AS VARCHAR(MAX)) = '''' 
          THEN 
           Answer.AnswerText 
         ELSE 
          CAST(Answer.AnswerText AS VARCHAR(MAX)) 

        END AS AnswerText 
      FROM 
     (
       SELECT  a.ID, a.STUDYID, a.SITEID, a.CSID, a.VERSIONID, a.CASENUMBER, a.CASEINITIALS, a.EVENTDATE, a.CASEDETAILSFILE, a.CASEDETAILSFILEVERSION, 
             a.CASESTATUS, a.RECORDSTATUS, a.CASEDATEUPDATED, a.PROJECTDATEUPDATED, a.PanelID, a.DecisionSetID, a.SUBJNO, a.EventType, a.TriggerEvent, 
             a.Priority, a.id1, a.id2, a.dateid, a.dateiddt1, a.dateiddt2, a.extratext1, a.extratext2, SchemaWema.PROJECTPANELDECISIONSETVIEW.DECISIONSETNAME 
       FROM   SchemaWema.PROJECTCASE AS a LEFT OUTER JOIN 
             SchemaWema.PROJECTPANELDECISIONSETVIEW ON a.DecisionSetID = SchemaWema.PROJECTPANELDECISIONSETVIEW.DECISIONSETID 
       WHERE  (a.CASEDATEUPDATED = 
              (SELECT  MAX(CASEDATEUPDATED) AS Expr1 
              FROM   SchemaWema.PROJECTCASE AS b 
              WHERE  (a.ID = PROJECTID) AND (a.CSID = CASEID) AND (a.VERSIONID = VERSIONID))) AND (a.RECORDSTATUS <> ''D'') 
     )Cases 
     LEFT OUTER JOIN 
     (
       SELECT  PROJECTID, PROJECTNAME, PROJECTSPONSOR 
       FROM   SchemaWema.PROJECT AS a 
       WHERE  (PROJECTDATEUPDATED = 
            (SELECT  MAX(PROJECTDATEUPDATED) AS Expr1 
            FROM   SchemaWema.PROJECT AS b 
            WHERE  (a.ID = PROJECTID))) AND (RECORDSTATUS <> ''D'') 

     ) Project on 
     Project.ID = Cases.ID 
     LEFT OUTER JOIN 
     (
       SELECT DISTINCT a.ID, a.STUDYID, a.SITEID, a.PROJECTSTUDYSITENAME, a.PROJECTSTUDYSITENUMBER, SchemaWema.PROJECTSTUDYVIEW.PROJECTSTUDYNAME, a.COUNTRY 
       FROM   SchemaWema.PROJECTSTUDYSITE AS a INNER JOIN 
             SchemaWema.PROJECTVIEW ON a.ID = SchemaWema.PROJECTVIEW.ID INNER JOIN 
             SchemaWema.PROJECTSTUDYVIEW ON a.ID = SchemaWema.PROJECTSTUDYVIEW.ID AND 
             a.STUDYID = SchemaWema.PROJECTSTUDYVIEW.STUDYID 
       WHERE  (a.PROJECTSTUDYSITEDATEUPDATED = 
              (SELECT MAX(PROJECTSTUDYSITEDATEUPDATED) AS Expr1 
              FROM   SchemaWema.PROJECTSTUDYSITE AS b 
              WHERE  (a.ID = PROJECTID) AND (a.STUDYID = STUDYID) AND (a.SITEID = SITEID))) AND (a.RECORDSTATUS <> ''D'') 

     )Sites on 
     Cases.SITEID = Sites.SITEID 
     LEFT OUTER JOIN 
     (
       SELECT DISTINCT PROJECTID, STUDYID, PROJECTSTUDYNAME, PROJECTSTUDYNUMBER, PROJECTSTUDYDESCRIPTION 
       FROM   SchemaWema.PROJECTSTUDY AS a 
       WHERE  (PROJECTSTUDYDATEUPDATED = 
              (SELECT  MAX(PROJECTSTUDYDATEUPDATED) AS Expr1 
              FROM   SchemaWema.PROJECTSTUDY AS b 
              WHERE  (a.ID = PROJECTID) AND (ISNULL(a.STUDYID, ''0'') = ISNULL(STUDYID, ''0'')))) AND (RECORDSTATUS <> ''D'') 
     )Study on 
     Study.STUDYID = Cases.STUDYID 

     inner join 
     (
       SELECT  VoterID, UID, SurveyID, ContextUserName, VoteDate, StartDate, IPSource, Validated, ResumeUID, ResumeAtPageNumber, ProgressSaveDate, 
          ResumeQuestionNumber, ResumeHighestPageNumber, LanguageCode, SurveyStatus, VoteAcceptRejectDate, CaseID, VersionID, PdfFileName, voterSurveyStatus, 
          dateupdated, recordstatus, modifiedby, changereason 
       FROM   SchemaWema.vts_tbVoter AS a 
       WHERE  (dateupdated = 
              (SELECT  MAX(dateupdated) AS Expr1 
              FROM   SchemaWema.vts_tbVoter AS b 
              WHERE  (a.VoterID = VoterID) AND (a.SurveyID = SurveyID) AND (a.CSID = CaseID) AND (a.VersionID = VersionID))) 

     ) Voter on 

     Voter.CSID = Cases.CSID 
     AND Voter.VersionID = Cases.VersionID 
     Inner Join 
      (
        SELECT DISTINCT SurveyID, DecisionSetId, FormType 

         FROM   SchemaWema.vts_tbSurvey AS a 
         WHERE  (dateupdated = 
            (SELECT  MAX(dateupdated) AS Expr1 
            FROM   SchemaWema.vts_tbSurvey AS b 
            WHERE  (a.SurveyID = SurveyID))) AND (recordstatus <> ''D'') 
     ) Survey on 
     Survey.SurveyID = Voter.SurveyID 
     inner Join 
     (
       SELECT DISTINCT 
             VoterID, AnswerID, SectionNumber, CAST(AnswerText AS varchar(MAX)) AnswerText, SurveyID, CaseID, versionID 
       FROM   SchemaWema.vts_tbVoterAnswers AS a 
       WHERE  (dateupdated = 
            (SELECT MAX(dateupdated) AS Expr1 
            FROM   SchemaWema.vts_tbVoterAnswers AS b 
            WHERE  (a.VoterID = VoterID) AND (a.AnswerID = AnswerID) AND (a.SectionNumber = SectionNumber) AND (a.SurveyID = SurveyID) AND (a.CSID = CaseID) AND 
                  (a.versionID = versionID))) AND (recordstatus <> ''D'') 
     )VoterAnswers on 
     VoterAnswers.SurveyID = Survey.SurveyID 
     AND VoterAnswers.CSID = Voter.CSID 
     AND Voter.VoterID = VoterAnswers.VoterID 
     AND VoterAnswers.versionID = Voter.versionID 
     AND VoterAnswers.SurveyID = Voter.SurveyID 
     FULL OUTER JOIN 
     (

       select DISTINCT a.USERID, a.USERNAME, a.FIRSTNAME, a.LASTNAME, a.SHOWNNAME 
       from SchemaWema.users as a 
       WHERE (a.userdateupdated = 
        (SELECT  MAX(b.userdateupdated) AS Expr1 
        FROM   SchemaWema.users AS b 
        WHERE (a.userID = b.userID) )) 
       AND (a.RECORDSTATUS <> ''D'') 
     ) Users on 
     VoterAnswers.VoterID = Users.USERID 
     AND Voter.VoterID = Users.USERID 
     inner join 
     (
       SELECT DISTINCT AnswerID, QuestionID, AnswerText FROM   SchemaWema.vts_tbAnswer AS a 
          WHERE  (dateupdated = 
           (SELECT  MAX(dateupdated) AS Expr1 
           FROM   SchemaWema.vts_tbAnswer AS b 
           WHERE  (a.AnswerID = AnswerID))) AND (recordstatus <> ''D'') 
     ) Answer on 
      Answer.AnswerID = VoterAnswers.AnswerID 
      inner Join 
      (
        SELECT DISTINCT QuestionID,SurveyID, QuestionText 
         FROM   SchemaWema.vts_tbQuestion AS a 
         WHERE  (dateupdated = 
            (SELECT  MAX(dateupdated) AS Expr1 
            FROM   SchemaWema.vts_tbQuestion AS b 
            WHERE  (a.QuestionID = QuestionID))) AND (recordstatus <> ''D'') 
     ) Question on 
      Answer.QuestionID = Question.QuestionID 
      AND Question.SurveyID = Survey.SurveyID 
      AND Question.SurveyID = VoterAnswers.SurveyID 
     inner join 
     (
       SELECT DIStinct 
         [PANELID] ,[PANELNAME] 
        FROM [AdjudicateV3].[Adjudicate].[PROJECTPANELVIEW] 
     )Panel on 
     Panel.PANELID = Cases.PanelID 

     WHERE CASEs.ID = ' + @ID + ' AND Survey.DecisionSetId = '+ DeeSetId +' AND Survey.FormType = '+ @Forms +' 

) AS SourceTable 
PIVOT 
(
     MAX(AnswerText) 
     FOR QuestionText IN ('[email protected]+') 
) AS PivotTable' 
+1

Да, это может быть сделано. –

+0

Если вам нужна помощь в написании запроса, вам необходимо предоставить некоторые детали для нас. Это будет отличное место для начала. Http: // spaghettidba.ru/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+5

Возможный дубликат [SQL Server dynamic PIVOT query?] (http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) –

ответ

1

Это может быть сделано с помощью динамического шарнира.

Первое, что вам нужно сделать, это построить COLS вы собираетесь использовать для поворота ..

declare @cols varchar(max) 
select @cols = Coalesce(@cols + ', ', '') + '[' + q.Question + '(' + a.Question + ')]' 
from Questions q 
join Answers a on q.ID = a.QuestionID 

это сцепить все заголовки столбцов, которые вы хотите в одну строку, как

[What is your favorite Car Color(Blue)], [What is your favorite Car Color(Red)] 

ввод имен столбцов внутри скобок важно здесь ...

следующего шага является построение сводного запроса

это создаст подзапрос с тремя столбцами. Пользователь, выберите, ответ .. пользователь - это имя пользователя, выбранное только для каждой записи X и ответ, который используется для поворота. Ответ выглядит как имена столбцов выше без скобок ..

рядом он вращает подзапрос .. и выбирает имя и динамические столбцы ..

SQL Fiddle Example

+0

JamieD77 Спасибо, MVP !!! Это круто!!!! – larry