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

时间:2015-03-04 06:21:55

标签: sql sql-server join

我有两个表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的所有记录。

有人可以为此提供帮助吗?

1 个答案:

答案 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