4

私は、1つのテーブルに人物に関するバイオ情報を保持するMSSQLデータベースを持っています:

ID: Name : Age : Sex

別のテーブルには、次のような多くの質問に対する回答が保持されています。

PersonID : QuestionID : Answer

次のように、MSSQLMSE を介してそれらすべてを 1 つのレコードに表示することは可能ですか。

ID : Name : Age : Sex : Question1Answer : Question2Answer : Question3Answer : And so on?
4

6 に答える 6

4

これを試して:

SELECT ID, name, age, sex, Question1answer, Question2answer
FROM
(
  SELECT 
    p.Id,
    p.Name,
    p.Age,
    p.sex,
    questionanswer = 'Question' + CAST(q.questionid AS VARCHAR(10)) + 'answer',
    q.Answer
  FROM Persons p 
  INNER JOIN Questions q ON p.Id = q.UserID
) t
PIVOT
(
  MAX(Answer)
  FOR questionanswer IN([Question1answer], [Question2answer])
 ) p;

SQL フィドルのデモ

これにより、次のことが得られます。

| ID |     NAME | AGE | SEX | QUESTION1ANSWER | QUESTION2ANSWER |
-----------------------------------------------------------------
|  1 |    Ahmed |  25 |   M |             Yes |              No |
|  2 | Mohammed |  30 |   M |              No |           Never |
|  3 |     Sara |  25 |   F |              No |           Never |

ただし、ユーザーごとに任意の数の質問に対してこれを動的に実行する場合は、次のようにすることができます。

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct 
                        ',' +
                        QUOTENAME('Question' + 
                                  CAST(questionid AS VARCHAR(10)) + 
                                  'answer')
                FROM questions
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');


SET @query = 'SELECT ID, name, age, sex, ' + @cols +
             ' FROM
              (
                SELECT 
                  p.Id,
                  p.Name,
                  p.Age,
                  p.sex,
                  questionanswer = ''Question'' +
                                   CAST(q.questionid AS VARCHAR(10)) + 
                                   ''answer'',
                  q.Answer
                FROM Persons p 
                INNER JOIN Questions q ON p.Id = q.UserID
              ) t
              PIVOT
              (
                MAX(Answer)
                FOR questionanswer IN( ' + @cols + ') ) p ';

SQL Fiddle 動的デモ

于 2012-12-11T08:54:40.200 に答える
0

これ(ここではSQL Fiddle)があなたが探しているものだと思います。特定の個人IDについて。

注: p = Person Tablea = Answer TableおよびqId = QuestionId

DECLARE @S VARCHAR(Max)
DECLARE @PersonId INT = 1

SELECT @S=ISNULL(@S+' : ','') + convert(varchar(10), id) +' : '+ name
             +' : '+ convert(varchar(10), age)+' : '+sex
FROM p 
WHERE p.Id = @PersonId

SELECT @S=ISNULL(@S+' : ','') + 
    'Question' + convert(varchar(10), qid) +'Answer : '+ answer

FROM a
WHERE pId = @PersonId

SELECT @S

--Following results is in one line 
--1 : X : 25 : M : Question11Answer : Here is my answer for 11 : 
--Question12Answer : Here is my answer for 12 : 
--Question101Answer : Here is my answer for 101
于 2012-12-11T09:27:35.733 に答える
0

テーブルの結果を転置するには、SQL Server の PIVOT コマンドが適切です。http://msdn.microsoft.com/en-us/library/ms177410(v=sql.100).aspx を参照してください

以下のスクリプトは、事前定義された一連の質問で機能します。可変数の列の場合、このリンクはhttp://blog-mstechnology.blogspot.com/2010/06/t-sql-pivot-operator-with-dynamic.htmlに役立ちます。

 DECLARE @Person TABLE(
    ID INT,
    Name VARCHAR(50),
    Age INT,
    Sex CHAR(1)
)

DECLARE @Questions TABLE(
    ID INT,
    QuestionID INT,
    Question VARCHAR(200),
    Answer VARCHAR(200)

)

INSERT INTO @Person VALUES
(1,'Andrew',56,'M'),
(2,'Marge',65,'F')

INSERT INTO @Questions VALUES
(1,1,'Question1','Andrews Answer 1'),
(1,2,'Question2','Andrews Answer 2'),
(2,1,'Question1','Marge Answer 1'),
(2,3,'Question3','Marge Answer 3')


SELECT ID,Age,Name,Sex,
[1] AS 'Question1Answer',
[2] AS 'Question2Answer',
[3] AS 'Question3Answer'
FROM(
SELECT P.ID,P.Age,P.Name,P.Sex,Q.QuestionID,Q.Answer
    FROM @Person P
    INNER JOIN @Questions Q  ON Q.ID = P.ID
) Source
PIVOT
(
    MAX(Answer)
    FOR QuestionID IN ([1],[2],[3])
)AS PT
于 2012-12-11T08:48:12.710 に答える
0

これを試して:

SELECT
    ID,
    Name,
    Age,
    Sex,
    [1] AS Question1Answer,
    [2] AS Question1Answer,
    [3] AS Question1Answer
FROM
    (SELECT
    i.ID,
    i.Name,
    i.Age,
    i.Sex,
    q.QuestionId,
    q.Answer
    FROM
    dbo.Info AS i
    INNER JOIN dbo.Questions AS q on q.ID = i.ID) AS m
PIVOT
    (
        MAX(Answer) FOR QuestionId in ([1],[2],[3])
    ) as PivotTable
于 2012-12-11T08:52:45.097 に答える
0

この方法を試してください: (データベースの互換性レベルを 90 以上に設定します)

begin 
Declare @MainSQL nVarchar(Max)
Declare @Param nVarchar(Max)
Declare @QId int
set @Param = ''
Declare curParam Cursor  For select Distinct QuestionID from Questions
open curParam
Fetch next from curParam into @QId 
While @@Fetch_Status = 0
Begin
    set @Param = @Param +'[' +convert(nVarchar,@QId ) + '],'
    Fetch next from curParam into @QId 
End
close curParam;
Deallocate curParam;
set @Param = left(@Param,len(@Param)-1)
Set @MainSQL  = 'Select ID,Name,Age,***
From
(select P.ID,Name,Age,
Q.QuestionID, Q.Answer From Person P Left outer join
Questions Q 
ON P.ID = Q.PersonID) S
Pivot
(Max(Answer) 
For QuestionID in(***)
) as Pvt'
Set @MainSQL  =replace(@MainSQL,'***',@Param);
--print @MainSQL

execute sp_executesql @MainSQL

End
于 2012-12-11T09:33:32.743 に答える
0
select ID,Name,Age,Sex,
(select top 1 Answer from Questions 
               where PersonId=prerson.id AND QuestionID=1) as Question1Answer,
(select top 1 Answer from Questions 
               where PersonId=prerson.id AND QuestionID=2) as Question2Answer,
(select top 1 Answer from Questions 
               where PersonId=prerson.id AND QuestionID=3) as Question3Answer

from prerson
于 2012-12-11T08:46:22.847 に答える