如何为group-select构建正确的SQL查询?

时间:2013-07-07 18:04:35

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

我的SQL技能低的问题。 在表格Products中,其结构为IdSupplierBrandArticlePrice我必须按{{1}对所有记录进行分组}和Brand并选择在查询Article中指定的组ID在组中的价格最低或其价格低于其他ID超过5%。

尝试使用SupplierGROUP BY,但没有任何效果。有什么想法吗?

算法:
 1.按HAVINGBrand分组所有记录  2.仅选择包含指定Article之一的组  3.如果在选定的组中,指定的Supplier没有最低Supplier或他的Price低于另一个的最低,则选择该组

2 个答案:

答案 0 :(得分:1)

我正在将这个问题解释为找到供应商价格比最低价格高出5%以上的特定供应商的所有产品。语言有点难以理解,所以这是我最好的猜测。

如果是这样,使用窗口函数计算组的最低价格,然后使用简单的逻辑:

select p.*
from (select p.*,
             min(price) over (partition by supplier, article) as MinPrice
      from products p
     ) p
where SupplierID = @SupplierId and
      price > 1.05 * MinPrice;

编辑:

要获得min()排除某些供应商:

select p.*
from (select p.*,
             min(case when supplier not in (<list>) then price end) over
                  (partition by supplier, article) as MinPrice
      from products p
     ) p
where SupplierID = @SupplierId and
      price > 1.05 * MinPrice;

答案 1 :(得分:0)

不完全确定你所追求的是什么,但如果我正确地读了你的问题,那么

Select * From Products p
Where price != (Select Min(Price)
               From products
               Where Brand = p.Brand
                 And Article = p.Article)
  And price < 0.95 *
              (Select Min(Price)
               From products
               Where id != p.Id
                  And Brand = p.Brand
                  And Article = p.Article)

如果这不是您想要的,它仍然应该为您提供如何为您想要的东西编写正确的SQL的线索......