Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 分组并分成不同的列_Sql_Sql Server 2008 - Fatal编程技术网

Sql 分组并分成不同的列

Sql 分组并分成不同的列,sql,sql-server-2008,Sql,Sql Server 2008,我正在尝试将一些数据分组,并将一列分成几列。以下是我正在使用的表类型,尽管这些列中的每一列都来自通过每个列上的ID连接的各个表: ParticipantId QuestionText QuestionAnswer 1 What is your gender? 2 2 What is your gender? 1 3 Wh

我正在尝试将一些数据分组,并将一列分成几列。以下是我正在使用的表类型,尽管这些列中的每一列都来自通过每个列上的ID连接的各个表:

ParticipantId       QuestionText            QuestionAnswer
1               What is your gender?                2
2               What is your gender?                1
3               What is your gender?                1
4               What is your gender?                2
5               What is your gender?                1
1               What is your age?                   28
2               What is your age?                   NULL
3               What is your age?                   55
4               What is your age?                   63


And this is what I want to achieve:  


ParticipantId      Question1Answer    Question2Answer    Question3Answer        
        1               2               28                  3
        2               1               NULL                4
我想这是一件很难做到的事?因为问卷包含大约100个问题。
我认为如果不输入每个问题ID,使用案例是不合适的。我正在使用SQLServer2008。下面是我正在使用的一些表结构。我相信还有比打字更清晰的方法

QuestionNaRequestion表包含序列的QuestionNumber,并通过questionID(问题表PID)连接到问题表。问题表包含问题文本,并使用包含答案字段的QuestionID链接到答案表。然后答案表经过一个名为QuestionnaireInstance的链接表,最后链接到包含参与者ID的纸质问卷表


这可能还没有让它变得更清晰,让我知道任何其他可能会让它更清晰的事情。

如果表中列组合ParticipantId和QuestionText的唯一性,那么您也可以使用下面的查询来获得所需的输出-

SELECT Participantid,
       MAX(CASE
             WHEN Questiontext = 'What is your gender?' THEN
              Questionanswer
             ELSE
              NULL
           END) AS Question1answer,
       MAX(CASE
             WHEN Questiontext = 'What is your age?' THEN
              Questionanswer
             ELSE
              NULL
           END) AS Question2answer,
       MAX(CASE
             WHEN Questiontext = '...your third question...' THEN
              Questionanswer
             ELSE
              NULL
           END) AS Question3answer,
       .. 
       ..
  FROM Your_Table_Name
 GROUP BY Participantid

如果您不想每次都键入所有问题文本,您可以始终使用以下方法:

;with sample_data as
(
SELECT
ParticipantId
,QuestionText
,QuestionAnswer
,row_number() OVER (PARTITION BY PARTICIPANTID ORDER BY (SELECT NULL)) AS rn
FROM yourdatatable
)
SELECT
PARTICIPANTID
,MAX(CASE WHEN rn = 1 THEN questionanswer END) AS Q1
,MAX(CASE WHEN rn = 2 THEN questionanswer END) AS Q2
,MAX(CASE WHEN rn = 3 THEN questionanswer END) AS Q3
,MAX(CASE WHEN rn = 4 THEN questionanswer END) AS Q4
FROM sample_data
GROUP BY ParticipantId

但是,在你的情况下,你最好考虑一下,根据你最终想要用

结束多少列,你能阐明你的表结构吗?很难理解您发布的内容。发布您的SQL DDL(创建表内容)会更好。。。我一点也不懂你的例子你怎么知道哪个问题是问题1,哪个问题是问题2,等等?会有数量不一的问题吗?“这可能没有让问题变得更清楚”——不会。尝试为您提到的每个表添加DDL(使用SSMS中的脚本表作为CREATE TO…选项),以及现有查询的文本。