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)
    )

我想选择一个产品列表(所有字段),但每个make. make应通过按顺序应用一组规则来确定为每个产品选择的产品。例如, - 如果存在属于特定的红色产品make,请选择该产品。- 对于make尚未代表的所有产品,请选择不到两年的产品。- 对于所有make尚未代表的产品,选择 x 的类别 1 值的产品 - 排泄物

您可以通过维护所选产品的一些内存/临时表来做到这一点,并且仅当该表尚未包含潜在产品的品牌时才将其他产品插入此表中。通过按顺序应用一个insert select into规则,内存/临时表被填满。例如。

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)

然而,这似乎不是很优雅。

注意:这是对实际问题的简化。在实际问题中,每个选择级别只能有一个有效产品。

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 回答