0

些細な問題のように見えますが、機能させることができません。OracleSQLにあります。スクリプトのサンプルは次のとおりです。

create table product (
product_id number primary key,
name varchar(255)
);

create table producer (
producer_id number primary key,
name varchar(255)
);

create table catalog (
pp_product_id number,
pp_producer_id number,
price number
);


alter table catalog add constraint pp_product_id1 foreign key (pp_product_id) references product (product_id);
alter table catalog add constraint pp_product_id2 foreign key (pp_producer_id) references producer (producer_id);


insert into product (product_id, name) values (1, 'HDD 250 gb');
insert into product (product_id, name) values (2, 'HDD 500 gb');
insert into product (product_id, name) values (3, 'HDD 750 gb');

insert into producer (producer_id, name) values (1, 'Hitachi');
insert into producer (producer_id, name) values (2, 'Corsair');
insert into producer (producer_id, name) values (3, 'Western Digital');

insert into catalog (pp_product_id, pp_producer_id, price) values (1,1, 80);
insert into catalog (pp_product_id, pp_producer_id, price) values (1,3, 60);
insert into catalog (pp_product_id, pp_producer_id, price) values (2,1, 75);
insert into catalog (pp_product_id, pp_producer_id, price) values (2,2, 40);
insert into catalog (pp_product_id, pp_producer_id, price) values (3,2, 63);
insert into catalog (pp_product_id, pp_producer_id, price) values (3,3, 100);

つまり、合計6つの製品、3つのプロデューサー、3つのカテゴリーの製品(HDのタイプ)があります。私が必要としているのは、その製品に関連付けられた生産者名を持つ製品のタイプごとに、製品の最も安いものを表示することです。何かのようなもの:

Western Digital 250 gb 60

Corsair 500 GB 40

Corsair 750 gb 63

これにより、グループ内で最も安価なHDが選択されます(タイプ)

select p.name, min (c.price)
from product p, catalog c, producer prc
where c.pp_product_id = p.product_id and prc.producer_id = c.pp_producer_id
group by p.name;

...しかし、プロデューサー名を追加できませんか?私はいくつかの解決策を試しましたが、どれもうまくいきません。

4

4 に答える 4

2

これはあなたのコアな質問に答えるはずです。投稿はMySQLの問題に対処していますが、同じ概念が適用されます。

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

グループで最低価格の製品を入手したら、残りは参加するだけです。

于 2013-03-25T19:01:16.800 に答える
2

これはの良い使い方ですrow_number()。あなたのデータにはtypeフィールドがないので、私は製品テーブルにフィールドを発明しました:

select *
from (select p.name as product_name, p.type, prod.name as producer_name,
             price,
             ROW_NUMBER() over (partition by p.name order by price ) as seqnum
      from catalog c join
           product p
           on c.pp_product_id = p.product_id join
           producer prod
           on c.pp_producer_id = prod.producer_id
     ) t
where seqnum = 1;

最小価格ですべての製品が必要な場合は、次のわずかなバリエーションを使用してください。

select *
from (select p.name as product_name, p.type, prod.name as producer_name,
             price,
             min(price) over (partition by p.name) as minprice
      from catalog c join
           product p
           on c.pp_product_id = p.product_id join
           producer prod
           on c.pp_producer_id = prod.producer_id
     ) t
where price = minprice;
于 2013-03-25T19:04:08.400 に答える
1

@Gordon Linoffに感謝します-彼のコードを少し変更するだけで、私の問題は解決します。わかりやすくするために、ここにソリューションを投稿しています。

select *
from (select p.name as product_name, prod.name as producer_name,price,
ROW_NUMBER() over (partition by p.name order by price ) as seqnum
from catalog c join
product p
on c.pp_product_id = p.product_id join
producer prod
on c.pp_producer_id = prod.producer_id
) t
where seqnum = 1;
于 2013-03-25T19:17:16.617 に答える
0

その間、私はお互いに可能な答えを見つけました:

SELECT p.name, pr.name, c2.minprice
FROM product p, producer pr, catalog c,
  (SELECT pp_product_id, MIN(price) AS minprice
    FROM catalog c1
    GROUP BY pp_product_id
  ) c2
WHERE p.product_id=c.pp_product_id
AND pr.producer_id=c.pp_producer_id
AND p.product_id  =c2.pp_product_id
AND c.price       =c2.minprice;

出力は次のとおりです。

HDD 750 gb Corsair 6300

HDD 500 GB Corsair 4000

HDD 250 GB Western Digital 6000

于 2013-03-26T16:46:32.440 に答える