0

と の 2 つのテーブルがck_startupありck_priceます。価格テーブルには、列、、、、、cu_typeおよびが含まれています。スタートアップ テーブルは、 上の 1 対多の関係を介して価格テーブルにリンクされています。prd_typepart_cdqtydllrsck_startup.prd_type_cd = ck_price.prd_type

価格表には、同じ製品/部品/数量の複数のエントリが含まれていますが、顧客タイプは異なります。すべての顧客タイプが、これら 3 つの値の同じ固有の組み合わせを持っているわけではありません。次の 2 つのことを行うクエリを作成しようとしています。

  1. いくつかの列を結合しますck_startup(ck_price説明、およびいくつかの追加の値)。
  2. 顧客タイプごとck_priceの列でそれ自体に結合します。dllrsしたがって、合計で、製品/部品/数量の各一意のキーのインスタンスは 1 つしかなく、各顧客の価格列に値がある場合はその値になります。

私は自己結合テーブルを使用したことがありません。これまでのところ、両方の顧客が同じオプションを利用できる場合にのみレコードを表示できます。

誰かがサンプル コードを投稿するように要求するので、次のクエリを使用して、不足している価格を表示しません。

select pa.*, pac.dllrs from ck_price pa
join ck_price pac on pa.prd_type = pac.prd_type and pa.part_carbon_cd = pac.part_carbon_cd and pa.qty = pac.qty
where pa.cu_type = 'A' and pac.cu_type = 'AC';

編集: 2 つのテーブルのサンプル データと、完了時にどのように表示するかを次に示します。

CK_STARTUP
+-----+-----------------+-------------+
| | CD | DSC | PRD_TYPE_CD |
+-----+-----------------+-------------+
| | 3D | もの | SKD3 |
| | DC | DC | 違うもの | SKD |
| | DN2 | 似たようなもの | SKD |
+-----+-----------------+-------------+

CK_PRICE
+--------+-------------+---------+-----+-------+
| | CU_TYPE | PRD_TYPE_CD | PART_CD | 数量 | DLLRS |
+--------+-------------+---------+-----+-------+
| | あ | SKD3 | 1 | 100 | 10 |
| | あ | SKD3 | 1 | 200 | 20 |
| | あ | SKD3 | 1 | 300 | 30 |
| | あ | SKD | 1 | 100 | 50 |
| | あ | SKD | 1 | 200 | 100 |
| | エアコン | SKD3 | 1 | 300 | 30 |
| | エアコン | SKD | 1 | 100 | 100 |
| | エアコン | SKD | 1 | 200 | 200 |
| | エアコン | SKD | 1 | 300 | 300 |
| | エアコン | SKD | 1 | 400 | 400 |
+--------+-------------+---------+-----+-------+

コンボ:
+----+-----------------+---------+-----+---------+ ----------+
| | CD | DSC | PART_CD | 数量 | DLLRS_A | DLLRS_AC |
+----+-----------------+---------+-----+---------+ ----------+
| | 3D | もの | 1 | 100 | 10 | null | null |
| | 3D | もの | 1 | 200 | 20 | null | null |
| | 3D | もの | 1 | 300 | 30 | 60 |
| | DC | DC | 違うもの | 1 | 100 | 50 | 100 |
| | DC | DC | 違うもの | 1 | 200 | 100 | 200 |
| | DC | DC | 違うもの | 1 | 300 | null | null | 300 |
| | DC | DC | 違うもの | 1 | 400 | null | null | 400 |
+----+-----------------+---------+-----+---------+ ----------+
4

1 に答える 1

1

わかりました、以下のクエリと結果を見てください。

SELECT *
FROM   (SELECT
          cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type
        FROM ck_startup cs
          JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd))
PIVOT (SUM(dllrs) AS dlllrs FOR (cu_type) IN ('A' AS a, 'AC' AS ac))
ORDER BY cd, qty
;

出力:

CD DSC PART_CD 数量 A_DLLLRS AC_DLLLRS
-------- ----------------- ---------- ---------- -------- -- ----------
3D もの 1 100 10            
3D スタッフ 1 200 20            
3D スタッフ 1 300 30 30
DC 別のもの 1 100 50 50
DC 別のもの 1 200 100 100
DC 別のもの 1 300 150
DC 別のもの 1 400 200
DN2 類似のもの 1 100 50 50
DN2 類似のもの 1 200 100 100
DN2 類似のもの 1 300 150
DN2 類似のもの 1 400 200

テーブルDLLRS_ACにある列の値が異なる理由がわからないので、期待するものではありませんか? CK_PRICEたとえば、400出力の最後の行に ではなく、なぜあるの200ですか? この値が 2 倍になっているのはなぜですか (他の値はDLLRS_AC列にあるため)。

Oracle 10g を使用している場合は、 と を使用して同じ結果を得ることができます。以下をご覧DECODEくださいGROUP BY

SELECT
        cd,
        dsc,
        part_cd,
        qty,
        SUM(DECODE(cu_type, 'A', dllrs, NULL)) AS dllrs_a,
        SUM(DECODE(cu_type, 'AC', dllrs, NULL)) AS dllrs_ac
FROM (
  SELECT
    cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type
  FROM ck_startup cs
    JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd)
  )
GROUP BY cd, dsc, part_cd, qty
ORDER BY cd, qty;

結果は同じです。

ピボットについて詳しく知りたい場合は、Tim Hall の記事をお勧めします: Pivot and Unpivot at Oracle Base

于 2013-11-04T21:28:15.037 に答える