如何从一列中获得许多列?

时间:2012-11-01 09:01:33

标签: mysql sql select

我有一张桌子:

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型获得,获益和最大。当没有可用的列时,它应该为零。

1 个答案:

答案 0 :(得分: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

<强> EXAMPLE ON SQL FIDDLE

虽然单独存储类型会更有意义。即,有一列用于“获得”,“最大”等,另一列用于“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

<强> EXAMPLE ON SQL FIDDLE