奖励产品符合条件

时间:2012-10-07 02:34:02

标签: sql sql-server sql-server-2008

products purchased
--------------------------
bana
bana
bana
stra
kiwi

reward requirements table (related to a rewards table)
reward id, products
----------------------
1,bana
1,bana
1,bana
2,stra
2,bana
3,stra
4,cart
5,bana
5,bana
5,oliv

你能帮我用sql来获得奖励吗? 购买的产品符合资格?

在上述情况下,奖励ID将是:

1
2
3

如果有更好的设计可以使解决方案更容易,我也欢迎这些。我希望,为了便于解释,我正在使用产品名称。 (我稍后会用产品ID替换)

2 个答案:

答案 0 :(得分:4)

此查询将解决您的问题。

select r.reward_id
from (
  select reward_id, product, count(*) needed
  from reward_requirements
  group by reward_id, product
) r
left join (
  select product, count(*) bought
  from products_purchased
  group by product 
) p on r.product=p.product and p.bought >= r.needed
group by r.reward_id
having count(reward_id) = count(distinct p.product)
order by r.reward_id

为了使您的设计更好,您可以重做reward_requirements以获得列(产品,需要),而不必多次列出它。它也将摆脱第一个子查询。

答案 1 :(得分:2)

使用此架构:

CREATE TABLE            product
(
    product_id          int IDENTITY
    , name              varchar(50)
)

CREATE TABLE            requirement
(
    requirement_id      int IDENTITY
    , product_id        int
    , quantity          int
    , reward_id         int
)

CREATE TABLE            reward
(
    reward_id           int IDENTITY
    , reward            varchar(50)
)

CREATE TABLE            purchased
(
    purchased_id        int IDENTITY
    , product_id        int
    , quantity          int
)

您的查询变为:

SELECT      requirement.reward_id
FROM        requirement
            LEFT JOIN purchased
                ON  purchased.product_id = requirement.product_id
                AND purchased.quantity >= requirement.quantity
GROUP BY    requirement.reward_id
HAVING      COUNT(purchased.product_id) = COUNT(requirement.reward_id);

这是一个可以使用的SQLFiddle:http://sqlfiddle.com/#!3/e93c9/7