Sql 使用两个表而不使用任何循环获取结果
我有两张临时测试表和临时分数表 Temp_测试有以下列 临时标记有以下列 我想获取特定用户ID的结果 例如,如果对于A1,QTitle是A,Temp_测试表中的分数是5,则从A列中获取记录,其中Temp_分数表中的分数是5 如果不使用while循环,则希望获取特定UserId或UserId的所有记录 有人能帮上忙吗?您可能需要先取消临时标记,以便轻松地将其与临时测试连接起来,然后将结果旋转以获得所需的格式:Sql 使用两个表而不使用任何循环获取结果,sql,sql-server,join,Sql,Sql Server,Join,我有两张临时测试表和临时分数表 Temp_测试有以下列 临时标记有以下列 我想获取特定用户ID的结果 例如,如果对于A1,QTitle是A,Temp_测试表中的分数是5,则从A列中获取记录,其中Temp_分数表中的分数是5 如果不使用while循环,则希望获取特定UserId或UserId的所有记录 有人能帮上忙吗?您可能需要先取消临时标记,以便轻松地将其与临时测试连接起来,然后将结果旋转以获得所需的格式: ;WITH CteUnpivotedMarks AS( SELECT
;WITH CteUnpivotedMarks AS(
SELECT
ID, Score, Col = 'A', Value = A
FROM Temp_Marks
UNION ALL
SELECT
ID, Score, Col = 'B', Value = B
FROM Temp_Marks
UNION ALL
SELECT
ID, Score, Col = 'C', Value = C
FROM Temp_Marks
UNION ALL
SELECT
ID, Score, Col = 'D', Value = D
FROM Temp_Marks
)
SELECT
UserId = t.UserID,
A = MAX(CASE WHEN t.QTitle = 'A' THEN c.Value END),
B = MAX(CASE WHEN t.QTitle = 'B' THEN c.Value END),
C = MAX(CASE WHEN t.QTitle = 'C' THEN c.Value END),
D = MAX(CASE WHEN t.QTitle = 'D' THEN c.Value END)
FROM Temp_Test t
INNER JOIN CteUnpivotedMarks c
ON t.QTitle = c.Col
AND t.QMarks = c.Score
GROUP BY t.UserID
结果
你试过什么?如果您亲自尝试,您会学到更多。此外,我们纠正一个小错误要比从无到有地创造一个答案容易得多。请发布预期的结果格式。@Wewesthemanance我希望结果采用以下格式UserId a B C D A1 50 30 70 84 B3 80 70 34我尝试过使用pivot进行查询,但没有使用While循环我不是能够得到预期的结果。没问题,很高兴我能帮忙。一定要研究它,了解它是如何工作的。
Id Score A B C D
1 1 10 5 40 12
2 2 20 10 50 23
3 3 30 15 60 34
4 4 40 20 70 54
5 5 50 25 80 84
6 6 60 30 90 36
7 7 70 35 10 85
8 8 80 40 20 97
9 9 90 45 30 58
10 10 100 50 100 48
;WITH CteUnpivotedMarks AS(
SELECT
ID, Score, Col = 'A', Value = A
FROM Temp_Marks
UNION ALL
SELECT
ID, Score, Col = 'B', Value = B
FROM Temp_Marks
UNION ALL
SELECT
ID, Score, Col = 'C', Value = C
FROM Temp_Marks
UNION ALL
SELECT
ID, Score, Col = 'D', Value = D
FROM Temp_Marks
)
SELECT
UserId = t.UserID,
A = MAX(CASE WHEN t.QTitle = 'A' THEN c.Value END),
B = MAX(CASE WHEN t.QTitle = 'B' THEN c.Value END),
C = MAX(CASE WHEN t.QTitle = 'C' THEN c.Value END),
D = MAX(CASE WHEN t.QTitle = 'D' THEN c.Value END)
FROM Temp_Test t
INNER JOIN CteUnpivotedMarks c
ON t.QTitle = c.Col
AND t.QMarks = c.Score
GROUP BY t.UserID
UserId A B C D
---------- ----------- ----------- ----------- -----------
A1 50 30 70 84
B3 80 30 70 34
Z9 20 35 30 34