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