テーブルデザインに関する上記のコメントについては、実際にはテーブルに冗長性があります。 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
;
ハッピーを
あなたはそれぞれのEMPNOのためにどのように多くの重複行を持つことができますか?これが可変であれば、可変数の列を持つクエリが必要ですが、これは不可能です。また、何か試してみましたか?あなたの試みやあなたの問題を投稿してください。 – Aleksej
まずは:これは恐ろしいテーブルデザインです。名前が 'abc'で、別名が 'efg'のレコードでempno 1が見つかった場合はどうなりますか?次に、1人の従業員にいくつのエントリを持てますか?いくつの列を取得したいですか? –
また、なぜあなたはテーブルに「重複」を避けたいのですか?重複の何が問題なのですか?この種の状況では、これらは完全に有効で、標準的で標準的です。解決すべきいくつかの本当の問題はありませんか? – mathguy