2014-05-23 22 views
1

我有一個查看從表問題和表答案採取列。表問題有id和問題文本,而表答案有id,question_id(表問題中的fk)和答案文本。選擇ID從表中的文本到視圖

SELECT  
    QuestionID, QuestionTxt, [1], [2], [3], [4] 
FROM   
    (SELECT  
     ROW_NUMBER() OVER (PARTITION BY QuestionID 
          ORDER BY newid()) AnswerInQuestionID, 
     a.AnswerTxt, q.QuestionTxt, q.QuestionId 
    FROM   
     dbo.TblQuestion q 
    JOIN 
     dbo.TblAnswer a ON q.QuestionId = a.answer_question_id) A 
PIVOT (MAX(a.AnswerTxt) FOR AnswerInQuestionID IN ([1], [2], [3], [4])) AS piv 

從這個SQL,我能夠隨機化答案,但它只顯示文本。我希望將文本答案與它的ID一起使用

+0

的[選擇從SQL Server表n個隨機行]可能重複(http://stackoverflow.com/questions/848872/select-n -random-rows-from-sql-server-table) – vittore

+0

nope。這個sql完全沒有問題。我只是想添加答案ID到視圖 – sheldon

回答

1

很難從你的問題告訴你在哪裏希望能得到AnswerID。如果你想在一個專欄中,你將需要使用@ StayPuft的答案。如果你想把它當作文本列的一部分,你可以使用下面的SQL:

SELECT questionText, [1], [2], [3] 
FROM 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY QuestionID ORDER BY newid()) AnswerInQuestionID, 
     CAST(AnswerID AS VARCHAR(20)) + ' - ' + answerTxt AS answerTxt, 
     QuestionText 
    FROM questions q 
     JOIN answers a 
      ON q.QuestionID=a.answer_question_id 
) A 
PIVOT 
(
    MAX(answerTxt) 
    FOR AnswerInQuestionID IN ([1], [2], [3]) 
) as piv 

如果你希望他們三個單獨的列,您可以使用下面的SQL:

SELECT 
    questionText, 
    LEFT([1], 1) AS AnswerID1, 
    RIGHT([1], LEN([1]) - 1) AS AnswerText1, 
    LEFT([2], 1) AS AnswerID2, 
    RIGHT([1], LEN([1]) - 1) AS AnswerText1, 
    LEFT([3], 1) AS AnswerID3, 
    RIGHT([2], LEN([3]) - 1) AS AnswerText3 
FROM 
(
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY QuestionID ORDER BY newid()) AnswerInQuestionID, 
    CAST(AnswerID AS VARCHAR(20)) + answerTxt AS answerTxt, 
    QuestionText 
    FROM questions q 
    JOIN answers a 
    ON q.QuestionID=a.answer_question_id 
) A 
PIVOT 
(
    MAX(answerTxt) 
    FOR AnswerInQuestionID IN ([1], [2], [3]) 
) as piv 

編輯:添加了CHARINDEX()函數和管道('|')以允許不同的數字長度。可能有這樣做的更簡潔的方式,但這個工作對我來說:

SELECT 
    questionText, 
    LEFT([1], CHARINDEX('|', [1]) -1) AS AnswerID1, 
    RIGHT([1], LEN([1]) - CHARINDEX('|', [1])) AS AnswerText1, 
    LEFT([2], CHARINDEX('|', [2]) -1) AS AnswerID2, 
    RIGHT([2], LEN([2]) - CHARINDEX('|', [2])) AS AnswerText2, 
    LEFT([3], CHARINDEX('|', [3]) -1) AS AnswerID3, 
    RIGHT([3], LEN([3]) - CHARINDEX('|', [3])) AS AnswerText3 
FROM 
(
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY QuestionID ORDER BY newid()) AnswerInQuestionID, 
    CAST(AnswerID AS VARCHAR(20)) +'|'+ answerTxt AS answerTxt, 
    QuestionText 
    FROM questions q 
    JOIN answers a 
    ON q.QuestionID=a.answer_question_id 
) A 
PIVOT 
(
    MAX(answerTxt) 
    FOR AnswerInQuestionID IN ([1], [2], [3]) 
) as piv 
+0

出於好奇,哪個版本是你正在尋找的?如果您可以使用該詳細信息更新您的原始帖子,以便未來的搜索者可以找到類似問題的答案,那將是非常棒的。 – AHiggins

+0

我做了一些[修改](http://sqlfiddle.com/#!3/a1739/54)根據你的SQL,但它有問題,如果該ID有多個數字。看到[這裏](http://sqlfiddle.com/#!3/9c90c0/1) – sheldon

+0

好點 - 我認爲你應該可以使用某種子字符串函數去除差異,我會相應地更新。 – AHiggins

0

它看起來像a.AnswerTxt不在您的主要選擇中,只是QuestionID和QuestionTxt。在第一行添加a.AnswerTxt。

+0

這個SQL實際上沒有錯誤。我只想將答案ID添加到視圖中。請參考[sql小提琴](http://sqlfiddle.com/#!3/a1739/1) – sheldon

0

首先讓我說SQL小提琴真棒!

如果你想顯示的答案ID - 這是我做過什麼:

SELECT questionText, [1], [2], [3], answerID 
FROM 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY QuestionID ORDER BY newid()) AnswerInQuestionID, 
    answerTxt, 
    QuestionText, 
    answerID 
FROM questions q 
    JOIN answers a 
     ON q.QuestionID=a.answer_question_id 
    ) A 
    PIVOT 
    (
     MAX(answerTxt) 
     FOR AnswerInQuestionID IN ([1], [2], [3]) 
    ) as piv 
+0

這是完全錯誤的。我試過你的SQL到sql小提琴[this](http://sqlfiddle.com/#!3/a1739/19)是結果 – sheldon

+0

它實際上顯示錶答案中的所有答案 - 它只是一種撕裂該表除以適當地顯示答案正確的ID:答案1 - ID 1或4等 確切地說,你甚至想顯示ID? – StayPuft

+0

你說這是錯誤的,但你還沒有提供你想要輸出的樣本。此解決方案執行所要求的操作,即在視圖中添加一個AnswerID列。您是否試圖將單個列添加到視圖或多個列?如果你想要一個列,它將不得不保持Answer行的原始數量。 – AHiggins

相關問題