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

SQLで同じ行に異なる値を持つ列をどうやって処理するのですか?

    テーブル設計に関する以前のコメントに関して - 実際、テーブルには冗長性があります。 empname を別のテーブルに格納することができます。それを避けるために、ここでテーブルと結合します。すべての冗長性は潜在的な矛盾です。しかし、必要な結合をクエリして最小化するように最適化されたテーブル設計がある場合、別の場所からバッチ ジョブで入力される可能性があり、その設計は適切です。

    ここでやりたいことは、「水平方向のピボット」と呼ばれることがよくあります。ここにはいくつかの情報が不足しているため、ローンの最大数を 2 と想定しています。データを col1 または col2 に配置できるメカニズムが必要です。同じ empno の 1 行目か 2 行目かによって異なります。そのため、シーケンス番号を生成します。最後に、SUM(CASE seq WHEN ...) 式を GROUP BY と組み合わせて使用​​して、行数を減らし、テーブルを平坦化します。

    ここに行きます:

    -- first global table expression - the input table
    -- The table could exist already, and then this would not be needed.
    WITH foo(empno,empname,loanref,amount) AS (
              SELECT  1,'abc',123,100
    UNION ALL SELECT  1,'abc',456,200
    )
    -- second global table expression - add sequence number
    -- this needs to be in the query
    ,    foo_numbered AS (
    SELECT
      -- need a number: 1 for the first, 2 for the second loan
      ROW_NUMBER() OVER(PARTITION BY empname ORDER BY loanref) AS seq
    , *
    FROM foo
    )
    SELECT
      empno
    , empname
    , MAX(CASE seq WHEN 1 THEN loanref END) AS loanref_1
    , SUM(CASE seq WHEN 1 THEN amount END) AS amount_1
    , MAX(CASE seq WHEN 2 THEN loanref END) AS loanref_2
    , SUM(CASE seq WHEN 2 THEN amount END) AS amount_2
    FROM foo_numbered
    GROUP BY
      empno
    , empname
    ;
    

    楽しく遊んでね

    マルコ




    1. ページをリロードせずにMYSQLテーブルから値を更新しますか?

    2. LEFT JOINの後に欠落している値を埋める最適な方法は?

    3. PythonとMySQLの印刷結果

    4. SQL Serverで末尾の空白を削除する方法– RTRIM()