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

上の表には、2 人の生徒 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 の場合、得られるはずだったメリットは最大であり、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 フィドルの例

タイプを別々に保存する方が理にかなっていますが。つまり、「獲得」、「最大」などの列が 1 つと、「I」、「II」の列がもう 1 列あります。

編集

改訂されたデータ構造では、これは機能するはずです:

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 フィドルの例

于 2012-11-01T09:09:33.883 に答える