如何使用不同的标准嵌套查询

时间:2018-04-17 14:05:40

标签: sql sql-server-2008

我有一个Sales_details表,我希望获得前150种产品的报告以及每种产品的前10位客户。我下面的代码就是这样,并且工作正常。但是,两者使用相同的日期范围。我如何修改这一点,以便前150名产品基于10年的历史,而前10名客户基于2年的历史?

    select pc.*
    from (select pc.*,
         dense_rank() over (order by product_sales desc, product_id) as product_rank
    from (select sd.product_id, sd.custno, sum(sd.sales$) as total_sales,
               row_number() over (partition by sd.product_id order by sum(sd.sales$) as cust_within_product_rank,
               sum(sum(sd.sales$)) over (partition by sd.product_id) as product_sales
        from salesdetails sd
        group by sd.product_id, sd.custno
       ) pc
    ) pc
    where product_rank <= 150 and cust_within_product_rank <= 10;

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合:

select pc.*
from (select pc.*,
             dense_rank() over (order by product_sales desc, product_id) as product_rank
      from (select sd.product_id, sd.custno, sum(sd.sales$) as total_sales,
                   row_number() over (partition by sd.product_id 
                                      order by sum(case when date > dateadd(year, -2, getdate()) then sd.sales$ else 0 end)
                                     ) as cust_within_product_rank,
                    sum(sum(case when date > dateadd(year, -10, getdate()) then sd.sales$ else 0 end)) over (partition by sd.product_id) as product_sales
            from salesdetails sd
            group by sd.product_id, sd.custno
           ) pc
     ) pc
where product_rank <= 150 and cust_within_product_rank <= 10;

我不确定您为date使用哪个列,所以我只是将其称为date