2017-07-18 4 views
0

Ich verwende eine Datenbank, die aus Antworten auf Kundenfragebögen besteht. Mein Problem ist, dass, während die Kunden jeweils mehrere Fragen gestellt wurden, die Anzahl und die spezifischen Fragen variieren und jede Frage ihre eigene Aufzeichnung hat. Jeder Fragebogen hat also drei Fragen.SQL-Abfrage: Wert als neue Variable rekodieren

Ich habe die Fragetypen gruppiert und möchte einen Datensatz für jeden Fragebogen mit allen Antworten.

Wenn qnumber [1,2,3], [4,5,6], [7,8,9] sind die gleichen und die Info ist wie dieser

ID,qnumber,avalue 
1,1,4 
1,4,5 
1,7,6 
2,2,5 
2,5,6 
2,8,7 
3,3,7 
3,6,8 
3,9,9 

ich die bauen wollen Abfrage so ein Ergebnis wie folgt erhalten:

ID,q1,q2,q3 
1,4,5,6 
2,5,6,7 
3,6,7,8 

Ist das überhaupt möglich?

+0

Hier ist ein großartiger Ort zu starten. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

Was ist Ihre Konvertierungslogik? Wie qnumber und avalue in q1, q2, q3 transformiert wurden? –

Antwort

0

Versuchen Sie, diese

;With cte(ID,qnumber,avalue ) 
AS 
(
SELECT 1,1,4 UNION ALL 
SELECT 1,4,5 UNION ALL 
SELECT 1,7,6 UNION ALL 
SELECT 2,2,5 UNION ALL 
SELECT 2,5,6 UNION ALL 
SELECT 2,8,7 UNION ALL 
SELECT 3,3,7 UNION ALL 
SELECT 3,6,8 UNION ALL 
SELECT 3,9,9 
) 
SELECT Cstring AS CombinedValue 
    ,SUBSTRING(Cstring, 0, CHARINDEX(',', Cstring)) AS ID 
    ,SUBSTRING(Cstring, CHARINDEX(',', Cstring) + 1, CHARINDEX(',', Cstring) - 1) AS Q1 
    ,SUBSTRING(Cstring, CHARINDEX(',', Cstring) + 5, CHARINDEX(',', Cstring) - 1) AS Q2 
    ,SUBSTRING(Cstring, CHARINDEX(',', Cstring) + 9, CHARINDEX(',', Cstring) - 1) AS Q2 
FROM (
    SELECT DISTINCT STUFF((
       SELECT ',' + CAST(qnumber AS VARCHAR) + ',' + CAST(avalue AS VARCHAR) 
       FROM cte i 
       WHERE i.ID = o.ID 
       FOR XML PATH('') 
       ), 1, 1, '') AS Cstring 
    FROM cte o 
    ) DT 

Ergebnis

CombinedValue ID Q1 Q2 Q2 
    ------------------------------ 
    1,4,4,5,7,6  1 4 5 6 
    2,5,5,6,8,7  2 5 6 7 
    3,7,6,8,9,9  3 7 8 9 
0
CREATE TABLE #Temp 
(
    ID INT, 
    qnumber INT, 
    avalue INT 
) 

INSERT #Temp 
VALUES 
(1,1,4), 
(1,4,5), 
(1,7,6), 
(2,2,5), 
(2,5,6), 
(2,8,7), 
(3,3,7), 
(3,6,8), 
(3,9,9) 


SELECT ID, [1] AS q1, [2] AS q2, [3] AS q3 
FROM (
    SELECT ID, [1], [2], [3] 
    FROM (
     SELECT ID, 
      CASE WHEN qnumber IN (1, 2, 3) THEN 1 
       WHEN qnumber IN (4, 5, 6) THEN 2 
       WHEN qnumber IN (7, 8, 9) THEN 3 
      END AS qnumber, 
      avalue 
     FROM #Temp) AS SourceTable 
    PIVOT 
    (AVG(avalue) 
    FOR qnumber IN ([1], [2], [3])) AS PivotTable 
) t 

DROP TABLE #Temp