2017-01-09 1 views
-2

私のテーブルには、従業員が(車やスクーターを言う)2つのローンをご利用いただけます以下のstrucuturesqlの同じ行に異なる値を持つ列を移動するにはどうすればよいですか?

 
empno empname loan ref amount 
1  abc  123  100 
1  abc  456  200. 

すなわちを持っています。

出力が期待される:

 
empno empname  loan ref1 amt loanref2 amt 
1  abc   120  100 456   200 

繰り返し重複EMPNOを避けるために。どのようにsqlでそれについて行く?

+3

あなたはそれぞれのEMPNOのためにどのように多くの重複行を持つことができますか?これが可変であれば、可変数の列を持つクエリが必要ですが、これは不可能です。また、何か試してみましたか?あなたの試みやあなたの問題を投稿してください。 – Aleksej

+3

まずは:これは恐ろしいテーブルデザインです。名前が 'abc'で、別名が 'efg'のレコードでempno 1が見つかった場合はどうなりますか?次に、1人の従業員にいくつのエントリを持てますか?いくつの列を取得したいですか? –

+0

また、なぜあなたはテーブルに「重複」を避けたいのですか?重複の何が問題なのですか?この種の状況では、これらは完全に有効で、標準的で標準的です。解決すべきいくつかの本当の問題はありませんか? – mathguy

答えて

1

テーブルデザインに関する上記のコメントについては、実際にはテーブルに冗長性があります。 empnameを別のテーブルに格納することができます。これを避けるには、ここでテーブルに結合します。すべての冗長性は潜在的な矛盾です。 しかし、必要な結合を照会および最小化するために最適化された表設計を使用している場合、他の場所からバッチ・ジョブにデータが移入され、設計が適切になる可能性があります。

あなたがここでやりたいことは、しばしば「水平ピボット」と呼ばれます。 ここでは情報が不足していますので、最大ローン数は2と仮定しています。同じempnoの最初の行か2番目の行かによって、col1またはcol2にデータを格納できるメカニズムが必要です。そのため、私たちはシーケンス番号を生成します。最後に、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 
; 

ハッピーを

関連する問題