sql >> データベース >  >> RDS >> Oracle

Oracleは1列のみでグループ化されます

    ここに長いコメント;

    ええ、あなたはそれをすることはできません。考えてみてください...そのようなテーブルがある場合:

    Col1 Col2 Col3
    A    A    1
    B    A    2
    C    A    3
    

    そして、あなたはCol2だけでグループ化しています 、1つの行にグループ化されます... Col1はどうなりますか およびCol3 ?どちらにも3つの異なる行値があります。DBMSはそれらをどのように表示することになっていますか?

    Col1 Col2 Col3
    A?   A    1?
    B?        2?
    C?        3?
    

    これが、すべての列でグループ化するか、そうでなければそれらを集約または連結する必要がある理由です。 (SUM()MAX()MIN() など)

    結果をどのように見せたいかを教えてください。私たちがお手伝いできると確信しています。

    編集-回答:

    まず、質問を更新していただきありがとうございます。クエリにidがありません しかし、あなたの期待する結果はそうなので、私はそれぞれに別々に答えます。

    idなし

    目的を達成するには、すべての列でグループ化する必要があります。それを見ていきましょう。

    グループ化せずにクエリを実行する場合:

    select col1, col2, col3 from table where col3='200'
    

    あなたはこれを取り戻すでしょう:

    +----------+-------------+-------+
    | col1     | col2        | col3  |
    +----------+-------------+-------+
    | 1        | some text 1 | 200   |
    | 2        | some text 1 | 200   |
    | 5        | some text 1 | 200   |
    | 1        | some text 1 | 200   |
    +----------+-------------+-------+
    

    したがって、col1 = 1のみを表示する必要があります。 一度行。ただし、そのためには、すべてをロールする必要があります。 列の数が増えるので、DBMSは各列をどう処理するかを認識します。 col1のみでグループ化しようとした場合 、col2の余分なデータをどう処理するかを指示しなかったため、DBMSはエラーを起こします。 およびcol3

    select col1, col2, col3 from table where col3='200' group by col1 --Errors
    
    +----------+-------------+-------+
    | col1     | col2        | col3  |
    +----------+-------------+-------+
    | 1        | some text 1 | 200   |
    | 2        | some text 1 | 200   |
    | 5        | some text 1 | 200   |
    | ?        | some text 1?| 200?  |
    +----------+-------------+-------+
    

    3つすべてでグループ化すると、DBMSは行全体をグループ化することを認識し(これは必要なものです)、重複する行を1回だけ表示します。

    select col1, col2, col3 from table where col3='200' group by col1, col2, col3
    
    +----------+-------------+-------+
    | col1     | col2        | col3  |
    +----------+-------------+-------+
    | 1        | some text 1 | 200   |
    | 2        | some text 1 | 200   | --Desired results
    | 5        | some text 1 | 200   |
    +----------+-------------+-------+
    

    idを使用

    idを見たい場合 、DBMSにどのidを指定する必要があります 表示する。すべての列でグループ化しても、idが原因で、目的の結果が得られません。 列によって各行が区別されます(グループ化されなくなります):

    select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3
    
    +--------+----------+-------------+-------+
    | id     | col1     | col2        | col3  |
    +--------+----------+-------------+-------+
    | 2      | 1        | some text 1 | 200   | --id = 2
    | 3      | 2        | some text 1 | 200   |
    | 7      | 5        | some text 1 | 200   |
    | 8      | 1        | some text 1 | 200   | --id = 8
    +--------+----------+-------------+-------+
    

    したがって、これらの行をグループ化するには、idをどうするかを明示的に指定する必要があります。 s。希望する結果に基づいて、id = 2を選択します。 、これは最小 id 、それではMIN()を使用しましょう :

    select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
    --Note, MIN() is an aggregate function, so id need not be in the group by
    

    これにより、目的の結果が返されます(idを使用) ):

    +--------+----------+-------------+-------+
    | id     | col1     | col2        | col3  |
    +--------+----------+-------------+-------+
    | 2      | 1        | some text 1 | 200   |
    | 3      | 2        | some text 1 | 200   |
    | 7      | 5        | some text 1 | 200   |
    +--------+----------+-------------+-------+
    

    最終的な考え

    これがあなたの2つの問題の列でした:

    +--------+----------+-------------+-------+
    | id     | col1     | col2        | col3  |
    +--------+----------+-------------+-------+
    | 2      | 1        | some text 1 | 200   |
    | 8      | 1        | some text 1 | 200   |
    +--------+----------+-------------+-------+
    

    これらにぶつかったときはいつでも、各列に何をさせたいかを一度に1つずつ考えてください。 すべてを処理する必要があります グループ化または集計を行うときはいつでも列。

    • idid = 2のみが表示されます 、これはMIN()です
    • co1 、個別の値のみを表示したいので、GROUP BY
    • col2 、個別の値のみを表示したいので、GROUP BY
    • col3 、個別の値のみを表示したいので、GROUP BY


    1. PHPを使用してMySQLから現在の日付に日数を追加する

    2. MySQLとHBaseの接続性

    3. 共通テーブル式のINSERTで使用される副選択からデータを返す

    4. 生のSQLの主キー要件は、Djangoのクエリを複雑にします