Sql 使用两个表而不使用任何循环获取结果

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

我有两张临时测试表和临时分数表

Temp_测试有以下列

临时标记有以下列

我想获取特定用户ID的结果

例如,如果对于A1,QTitle是A,Temp_测试表中的分数是5,则从A列中获取记录,其中Temp_分数表中的分数是5

如果不使用while循环,则希望获取特定UserId或UserId的所有记录

有人能帮上忙吗?

您可能需要先取消临时标记,以便轻松地将其与临时测试连接起来,然后将结果旋转以获得所需的格式:

;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