2017-07-18 59 views
0

我正在使用一個由客戶調查問卷答案組成的數據庫。我的問題是,雖然客戶被問及每個問題,但數量和具體問題各不相同,每個問題都有自己的記錄。所以每個問卷都有三個問題。SQL查詢:將新值重新編碼爲新變量

我已經對問題類型進行了分組,並且希望每個問卷都有一個記錄,並附有所有答案。

如果qnumber [1,2,3],[4,5,6],[7,8,9]是相同的,該信息是這樣的

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 

我要建構查詢得到這樣的結果:

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

這是可能的嗎?

+0

這裏是一個偉大的地方開始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

什麼是您的轉換邏輯?如何將q值和q值轉換爲q1,q2,q3? –

回答

0

試試這個

;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 

結果

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