Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 server SQL Server:将多行中的数据获取到一行中_Sql Server - Fatal编程技术网

Sql server SQL Server:将多行中的数据获取到一行中

Sql server SQL Server:将多行中的数据获取到一行中,sql-server,Sql Server,我有下表,当initial设置为true和false时,我希望每个用户获得一行(userId)和Answer列值。下面的表格 UserId QuestionId Answer Initial ---------------------------------------------------------------- 027D76AC-DFBC-4BD2-9B88DD7B2456338E 1 5

我有下表,当initial设置为true和false时,我希望每个用户获得一行(
userId
)和
Answer
列值。下面的表格

UserId                              QuestionId   Answer  Initial
----------------------------------------------------------------
027D76AC-DFBC-4BD2-9B88DD7B2456338E 1            5       False
027D76AC-DFBC-4BD2-9B88DD7B2456338E 1            4       True
06B1713D-2E47-4454-8949C950C58753DC 1            4       True
216F33EF-1ACD-4D1F-86D2932AF598326E 1            5       False
216F33EF-1ACD-4D1F-86D2932AF598326E 1            4       True
23A950EB-3C68-4FE7-B719B86DC299343D 1            4       True
23A950EB-3C68-4FE7-B719B86DC299343D 1            4       False
将返回以下结果

UserId                              QuestionId   trueAnswer FalseAnswer
-----------------------------------------------------------------------
027D76AC-DFBC-4BD2-9B88DD7B2456338E 1            5          4
216F33EF-1ACD-4D1F-86D2932AF598326E 1            5          4
23A950EB-3C68-4FE7-B719B86DC299343D 1            4          4
这是可以通过子选择来完成的吗?

试试这个:

select UserID,
       max(QuestionID),
       max(case when Initial = 'True' then Answer end) [trueAnswer],
       max(case when Initial = 'False' then Answer end) [falseAnswer]
from TABLE_NAME
group by UserID
having count(distinct Initial) = 2

我认为下面是一个解决方案(上面的部分只是创建一个临时表来测试它)。我一直主张避免分组,而且我认为外部/交叉应用真的很酷。请注意,结果与您的结果相反。例如,你的最上面的答案是4。根据数据,它是5。除非我错过了什么

-- creating sample set
IF object_id('tempdb..#YOUR_TABLE') is not null drop table #YOUR_TABLE
CREATE TABLE #YOUR_TABLE (UserID VARCHAR(200), QuestionID INT, Answer INT, Initial BIT)
INSERT INTO #YOUR_TABLE(UserID, QuestionID, Answer, Initial)
Values
('027D76AC-DFBC-4BD2-9B88DD7B2456338E', 1,            5,       'false'),
('027D76AC-DFBC-4BD2-9B88DD7B2456338E', 1,            4,       'true'),
('06B1713D-2E47-4454-8949C950C58753DC', 1,            4,       'true'),
('216F33EF-1ACD-4D1F-86D2932AF598326E', 1,            5,       'false'),
('216F33EF-1ACD-4D1F-86D2932AF598326E', 1,            4,       'true'),
('23A950EB-3C68-4FE7-B719B86DC299343D', 1,            4,       'true'),
('23A950EB-3C68-4FE7-B719B86DC299343D', 1,            4,       'false')

-- solution
SELECT a.UserID,
       a.QuestionID,
       a.Answer,
       b.FalseAnswer
FROM #YOUR_TABLE AS a
     OUTER APPLY
     (
        SELECT y.Answer AS FalseAnswer
        FROM #YOUR_TABLE AS y
        WHERE y.Initial='false' AND a.UserID=y.UserID
     ) AS b
WHERE a.Initial='true' AND b.FalseAnswer IS NOT null
输出

UserID  QuestionID  Answer  FalseAnswer
027D76AC-DFBC-4BD2-9B88DD7B2456338E 1   4   5
216F33EF-1ACD-4D1F-86D2932AF598326E 1   4   5
23A950EB-3C68-4FE7-B719B86DC299343D 1   4   4

是的,但是你为什么要这么做?你试过什么?????你想要什么还不清楚。在这里学习如何提问。这将返回用户,他们只回答了两个问题,两个答案都是“真”或“假”。这就是OP想要的:)我不这么认为。OP请求“当初始值设置为true和false时”。每个选项一个。