2012-04-06 6 views
1

Ich habe eine Tabelle Survey_Data_Response, die mit einer 'into in'-Anweisung aus zwei Tabellen gefüllt ist - Survey_Question und Survey_Response, sie sind auf der QuestionID verbunden.Stored Procedure Pivot-Tabelle mit einer Temp-Tabelle erstellen

Ich möchte einen SP verwenden, um die Survey_Data_Response-Tabelle zu drehen und die Ergebnisse in einer temporären Tabelle zu speichern, damit ich sie abfragen kann, um Berichte zu entwickeln.

Die Survey_Data_Response-Tabelle enthält Felder - QuestionID, ResponseID, Question, Response, ResponseDateTime, ModulID.

Die Anzahl der Fragen kann sich je nach Umfrage ändern.

QuestionID Question Response ResponseDateTime  ResponseID ModuleID 
123   Age   34  2011-06-06 18:21:00  ABC   123 
345   Gender  M  2011-06-06 18:21:00  DEF   123 
567   Phone  444-4444 2011-06-06 18:21:00  HIG   123 
123   Age   23  2011-06-07 12:01:00  MNO   123 
789   Postal Code 90988  2011-06-07 12:01:00  XYZ   123 

Ich brauche den Tisch zu schwenken, wie diese aussieht, die Fragen wie Spalten und die Antwort in dem entsprechenden Feld ein.

ResponseID Age Gender  Phone  Postal Code  ResponsDateTime 
    ABC   34  M  444-4444     2011-06-06 18:21:00 
    XYZ   23       90988   2011-06-07 12:01:00 

Ich habe viele Pivot-Abfragen in den letzten 2 Tagen ausprobiert, aber ich hatte kein Glück. Hier bin ich, es gibt die Spaltenüberschriften zurück, aber die Antworten auf die Fragen werden nicht ausgefüllt.

Kann mir jemand helfen zu verstehen, warum dieses Pivot nicht funktioniert und wie es funktioniert?

Dank

Antwort

1

diesem Grund sollten Sie, was Sie wollen:

create table temp_SURVEY_DATA 
(
    questionid int, 
    question varchar(50), 
    response varchar(50), 
    responsedatetime datetime, 
    responseid varchar(3), 
    moduleid int 
) 

insert into temp_SURVEY_DATA values(123, 'Age', '34', '2011-06-06 18:21:00', 'ABC', 123) 
insert into temp_SURVEY_DATA values(345, 'Gender', 'M', '2011-06-06 18:21:00', 'ABC', 123) 
insert into temp_SURVEY_DATA values(567, 'Phone', '444-4444', '2011-06-06 18:21:00', 'ABC', 123) 
insert into temp_SURVEY_DATA values(123, 'Age', '23', '2011-06-07 12:01:00', 'XYZ', 123) 
insert into temp_SURVEY_DATA values(789, 'Postal Code', '90988', '2011-06-07 12:01:00', 'XYZ', 123) 

DECLARE @cols AS VARCHAR(MAX), 
    @query AS VARCHAR(MAX); 

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

set @query = 'SELECT responseid, moduleid, responsedatetime, ' + @cols + ' from 
      (
       select question, response, responsedatetime, responseid, moduleid 
       from temp_SURVEY_DATA 
      ) x 
      pivot 
      (
       max(response) 
       for question IN(' + @cols + ') 
      ) p ' 

execute(@query) 

Ergebnisse:

responseid moduleid responsedatetime  Age Gender Phone  Postal Code 
ABC   123  2011-06-06 18:21:00.000 34 M  444-4444  
XYZ   123  2011-06-07 12:01:00.000 23      90988 
+0

Die Herausforderung besteht darin, die Fragen sind dynamisch, sie für jede Umfrage ändern (jede Erhebung eine hat andere Modulid). Die Abfrage, die ich zur Verfügung gestellt habe, erstellt die Spalten für jede Frage. Wie bekomme ich die richtige Antwort für jede Frage? Ich schätze Ihre Hilfe. – Stan

+0

Dies wird die Liste der Fragen dynamisch abrufen und in Ihre Spaltenüberschriften konvertieren, und die Antwort wird mit jeder Frage verknüpft. Wenn Sie dem obigen Test zusätzliche Informationen hinzufügen, sehen Sie die richtigen Antworten zur richtigen Frage – Taryn

+0

Ja, ich sehe es jetzt. Danke Bluefuß. Ich erkannte, dass ich einige falsche Informationen zur Verfügung stellte, die ResponseID ist für jede Antwort unterschiedlich. Deshalb habe ich nicht die Ergebnisse erhalten, die ich erwartet hatte. Danke, dass du mir geholfen hast, das zu finden. Irgendwelche Vorschläge, wie sich die Abfrage ändern würde. Ich habe damit herumgespielt und laufe immer wieder in Fehler. Ich werde den Eröffnungskommentar aktualisieren. – Stan