0

次の型テーブルを考えると、

create table products (
    productid varchar(10),
    make varchar(10),
    age varchar(10),
    colour varchar(10),
    category1 varchar(10),
    category2 varchar(10),
    caregory3 varchar(10)
    )

商品のリスト (すべてのフィールド) を選択したいのですが、商品は 1 つにつき 1 つだけである必要がありますmake。それぞれに選択される製品はmake、一連のルールを順番に適用して決定する必要があります。例: - 特定の に属する赤い製品が存在する場合、makeこの製品を選択します。-makeまだ表示されていないすべての製品については、2 年未満の製品を選択してください。-makeまだ表されていないすべてについて、カテゴリ 1 の x の値である製品を選択してください - 排泄物

これを行うには、選択した製品のメモリ/一時テーブルを維持し、潜在的な製品の製造元がまだ含まれていない場合にのみ、このテーブルに追加の製品を挿入します。insert select intoメモリ/一時テーブルがいっぱいになるように、ルールごとに1 つ適用します。例えば。

insert into #temp 
select productid, make, age, colour, category1, category2, caregory3 
from products a 
where *rule applies*
and a.make not exists in (select make from #temp where a.make = #temp.make)

ただし、これはあまりエレガントではないようです。

注: これは実際の問題を簡略化したものです。実際の問題では、各選択レベルで有効な製品は 1 つだけです。

4

2 に答える 2

2

私はこれがあなたのために働くと思います:

SELECT * FROM
(
    SELECT *, RANK() OVER (PARTITION BY p.make ORDER BY 
    CASE 
      WHEN colour = 'red' THEN 1
      WHEN age < '2' THEN 2
      WHEN category1 = 'x' THEN 3
      ELSE 4
    END) as priority
    FROM products p 
) ranked
WHERE priority = 1
于 2013-10-03T09:14:38.780 に答える
0

これには、選択した製品を格納するテーブル変数と組み合わせてカーソルを使用できます。

DECLARE @selected_products table(
    productid varchar(10),
    make varchar(10),
    age varchar(10),
    colour varchar(10),
    category1 varchar(10),
    category2 varchar(10),
    caregory3 varchar(10)
)

DECLARE @current_make varchar(10)

DECLARE make_cursor CURSOR
    FOR SELECT DISTINCT make FROM products

OPEN make_cursor

FETCH NEXT FROM make_cursor INTO @current_make

WHILE @@FETCH_STATUS = 0
BEGIN

    DECLARE @red_product_count int

    SELECT @red_product_count = COUNT(productid)
    FROM products
    WHERE colour = 'red'

    IF @red_product_count > 0
    BEGIN

        SELECT TOP 1 productid, make, age, colour, category1, category2, category3
        INTO @selected_products
        FROM products
        ORDER BY some_field

    END

END
CLOSE make_cursor
DEALLOCATE make_cursor

カーソルのドキュメントは、http ://technet.microsoft.com/en-us/library/ms180169.aspx にあります。

次に、追加のフロー制御ロジックを使用してルールを適用し、カーソルをネストして目的の結果を得ることができます。ドキュメントには、さらに多くの例があります。

于 2013-10-03T09:08:21.093 に答える