2

したがって、これら 3 つのテーブルがあるとします (データは論理的ではありません)。

所有者

ID_OWNER | NAME | SURNAME 
1    John    Carter
2    Chris   Collins
3    Wright   Doe

ID_OWNER | MODEL | MODEL_TYPE
1     |   FORD_FOCUS  |  FAMILY
1     |  TRANSPORTER_VW   |   TRANSPORTER
1     |   VOLVO_S60     | null
2     |    VOLVO_S80    |  null

価格

MODEL_TYPE| PRICE1
FAMILY | 2
TRANSPORTER | 4

したがって、これまでに2つのSQLステートメントがあります。所有者の最初の検索:

SELECT 
    o.NAME, o.SURNAME 
FROM
    OWNERS o 
WHERE
    o.NAME='John';

2 番目の検索では、所有者「John」のモデルと価格を検索します。MODEL_TYPE の値が null になる可能性があるため、LEFT JOIN を使用しました。3列になりました。

SELECT
    CARS.ID_OWNER, CARS.MODEL, CARS.MODEL_TYPE, PRICE.PRICE1 
FROM
    CARS 
LEFT JOIN
    PRICE ON CARS.MODEL_TYPE = PRICE.MODEL_TYPE
WHERE
    CARS.ID_OWNER = 1;

結果:

ID_OWNER | MODEL          | MODEL_TYPE  | PRICE1 | NAME |SURNAME
    1    | FORD FOCUS     | FAMILY      |   2    | JOHN | CARTER
    1    | TRANSPORTER_VW | TRANSPORTER |   4    | JOHN | CARTER
    1    | VOLOV_S60      | null        | null   | JOHN | CARTER

ここで、John Carter が所有するすべての車とそのモデル タイプと価格の結果が 1 つの SQL クエリの 1 行に必要です。私は立ち往生しています。

出来ますか?ピボットやその他の可能性について読みましたが、適切な答えが見つかりません。それを結合して結果を 3 行ではなく 1 行にマージする方法は?

4

1 に答える 1

0

1 人あたり n 台以下の車を所有している場合は、次のようにすることができます。

with cte as (
    select
        o.NAME, o.SURNAME,
        c.MODEL,
        c.MODEL_TYPE,
        p.PRICE1,
        row_number() over(partition by o.ID_OWNER order by MODEL) as rn
    from OWNERS as o
        left outer join CARS as c on c.ID_OWNER = o.ID_OWNER
        left outer join PRICE as p on p.MODEL_TYPE = c.MODEL_TYPE
)
select
    c.NAME, c.SURNAME,
    max(case when c.rn = 1 then c.MODEL end) as MODEL1,
    max(case when c.rn = 1 then c.MODEL_TYPE end) as MODEL_TYPE1,
    max(case when c.rn = 1 then c.PRICE1 end) as PRICE11,
    max(case when c.rn = 2 then c.MODEL end) as MODEL2,
    max(case when c.rn = 2 then c.MODEL_TYPE end) as MODEL_TYPE2,
    max(case when c.rn = 2 then c.PRICE1 end) as PRICE12,
    max(case when c.rn = 3 then c.MODEL end) as MODEL3,
    max(case when c.rn = 3 then c.MODEL_TYPE end) as MODEL_TYPE3,
    max(case when c.rn = 3 then c.PRICE1 end) as PRICE13
from cte as c
group by c.NAME, c.SURNAME

sql fiddle demo

任意の数の車に対して動的 SQL としてこれを行うのは簡単ですが、クライアント側でこのクエリを使用できるかどうかはわかりません。通常は行 (列ではなく) を操作する方が簡単です。

于 2013-09-14T15:29:43.943 に答える