我有两个表Temp_Test和Temp_Marks。
Temp_Test有以下列
id UserId QId QTitle QMarks
1 A1 1 A 5
2 A1 2 B 6
3 A1 3 C 4
4 A1 4 D 5
5 B3 1 A 8
6 B3 2 B 6
7 B3 3 C 4
8 B3 4 D 3
9 Z9 1 A 2
10 Z9 2 B 7
11 Z9 3 C 9
12 Z9 4 D 3
,Temp_Marks有以下列
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
我想获取特定UserId的结果。
例如。如果对于A1,QTitle为A且Temp_test表中的标记为5,则从A列中获取记录,其中得分为Temp_Marks表中的5。
不使用while循环想要获取特定UserId或UserIds的所有记录。
有人可以为此提供帮助吗?
答案 0 :(得分:0)
您可能需要UNPIVOT
Temp_Marks
首先轻松加入Temp_Test
,然后PIVOT
结果以达到所需的格式:
;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
<强> RESULT 强>
UserId A B C D
---------- ----------- ----------- ----------- -----------
A1 50 30 70 84
B3 80 30 70 34
Z9 20 35 30 34