1

我有一张桌子:

IADATA

    Id     Studentid     Mon   Value  Type
    1      ABC1           1      12     1
    1      ABC1           1      02     2
    1      ABC1           1      18     4
    1      ABC1           1      09     7
    1      ABC1           1      12     8
    1      ABC1           1      22     10
    1      ABC2           2      12     1
    1      ABC2           2      02     2
    1      ABC2           2      18     4
    1      ABC2           2      09     7
    1      ABC2           2      12     10
    1      ABC2           3      05     1
    1      ABC2           3      02     2
    1      ABC2           3      20     4
    1      ABC2           3      09     7
    1      ABC2           3      12     10

在上表中,我们有两个学生 ABC1 和 ABC2 以及他们的数据。

现在我想要的结果如下:

   Id      Studentid      Mon     Obtained   Benefits   Max    Type
    1        ABC1          1         12         02      18       I
    2        ABC1          1         09         12      22       II
    3        ABC2          2         12         02      18       I
    4        ABC2          2         09         00      12       II
    5        ABC2          3         05         02      20       I
    6        ABC2          3         09         00      12       II

现在在结果中,您可以看到我根据 studentid 和 mon 以及类型以特定顺序放置值。如果类型是 I 它应该获得,那么好处然后 max 和 II 相同。它的选择查询可以是什么?

前面表格中的类型是链接的。取值为1、2、4时,应为新型I类获得、收益和最大值;当取值为7、8、10时,应为新型II类获得、收益和最大值。当没有可用的列时,它应该为零。

4

1 回答 1

3

这应该这样做:

SELECT  ID,
        StudentID,
        Mon,
        MAX(CASE WHEN Type LIKE 'Obtained%' THEN Value END) AS Obtained,
        MAX(CASE WHEN Type LIKE 'Benefit%' THEN Value END) AS Benefit,
        MAX(CASE WHEN Type LIKE 'Max%' THEN Value END) AS `Max`,
        CASE WHEN RIGHT(Type, 2) = 'II' THEN 'II' ELSE 'I' END AS Type
FROM    T
GROUP BY ID, StudentID, Mon, CASE WHEN RIGHT(Type, 2) = 'II' THEN 'II' ELSE 'I' END
ORDER BY ID, StudentID, Mon, Type

SQL FDDLE 示例

尽管单独存储类型更有意义。即有一列用于“获得”、“最大”等,另一列用于“I”、“II”

编辑

使用您修改后的数据结构,这应该可以工作:

SELECT  ID,
        StudentID,
        Mon,
        COALESCE(MAX(CASE WHEN Type IN (1, 7) THEN Value END), 0) AS Obtained,
        COALESCE(MAX(CASE WHEN Type IN (2, 8) THEN Value END), 0) AS Benefit,
        COALESCE(MAX(CASE WHEN Type IN (4, 10) THEN Value END), 0) AS `Max`,
        CASE WHEN Type IN (7, 8, 10) THEN 'II' WHEN Type IN (1, 2, 4) THEN 'I' END AS Type
FROM    T
WHERE   Type IN (1, 2, 4, 7, 8, 10)
GROUP BY ID, StudentID, Mon, CASE WHEN Type IN (7, 8, 10) THEN 'II' WHEN Type IN (1, 2, 4) THEN 'I' END
ORDER BY ID, StudentID, Mon, Type

SQL FDDLE 示例

于 2012-11-01T09:09:33.883 回答