2012-02-25 70 views
-1

我有表如下程序包和每月数,如..SQL查询的月份明智数

Package1 - 每搜索1美金 - 50个搜索(每月)包含在一个月包和额外的搜索将另算。

我在我的表像传递数据..

用户包表有其详细的用户的软件包信息。

UserpackageId Userid PackageId SearchPerMonth StartDatePackage EndDatePackage 
1    1   1    50   25/02/2012   25/02/2013 (1 YEAR) 

详细表

Userpackageid  SearchDate  SearchCost  
1     26/02/2012  1 Dollor 

现在我想总结像

包月套餐搜索统计数据 - 因为我有每月50搜索该包..如果额外的数发生超过50比它会显示其他计数额外在每月智慧..

+5

很不清楚的问题,说实话与你...尝试完全重写它。你有什么输入? 2.你想作为输出?你如何试图达到你的目标? – Smarty 2012-02-25 12:13:42

+0

我想总结上表的数据月明智..对于前。用户名xyz从他的软件包开始时开始搜索34名员工(猜测每年的软件包) - 上面的例子数据有50个搜索可用于他的软件包..所以每个月他可以搜索50,如果超过50,那么我希望单独计数。 – 2012-02-25 16:18:50

回答

0

我同意@Smarty你的问题是很难阅读,所以我必须对你的要求做一些假设。

看看这是否对你有帮助。

create table UserPackage(ID int identity(1,1), UserID int, PackageID int, 
    SearchPerMonth int, StartDate datetime, EndDate datetime) 
create table Detail(ID int identity(1,1), UserPackageID int, SearchDate datetime,Cost money) 

insert into UserPackage(UserID, PackageID, SearchPerMonth, StartDate, EndDate) 
    values(1,1,3,'2/15/12','2/15/13') 

insert into Detail(UserPackageID,SearchDate,Cost) values(1,'2/16/12',1) 
insert into Detail(UserPackageID,SearchDate,Cost) values(1,'2/17/12',2) 
insert into Detail(UserPackageID,SearchDate,Cost) values(1,'2/18/12',3) 
insert into Detail(UserPackageID,SearchDate,Cost) values(1,'2/19/12',4) 
insert into Detail(UserPackageID,SearchDate,Cost) values(1,'2/20/12',5) 

select 
    UserPackageID, 
    CostInLimit=sum(CostInLimit), 
    CostAboveLimit=sum(CostAboveLimit) 
from 
    (
    select 
     z.UserPackageID, 
     z.DetailID, 
     IsInLimit=case when z.RankInMonth > up.SearchPerMonth then 1 else 0 end, 
     CostInLimit=case when z.RankInMonth > up.SearchPerMonth then Cost else 0 end, 
     CostAboveLimit=case when z.RankInMonth > up.SearchPerMonth then 0 else Cost end, 
     z.Cost, 
     z.RankInMonth, 
     z.SearchDate 
    from 
     UserPackage up 
     inner join 
     (
      select 
       DetailID=ID, 
       UserPackageID, 
       Cost, 
       RankInMonth=RANK() OVER (PARTITION BY UserPackageID ORDER BY SearchDate), 
       SearchDate 
      from 
       Detail 
     ) z on z.UserPackageID = up.ID 
    ) y 
where 
    y.SearchDate between '2/15/12' and '3/15/12' 
group by 
    UserPackageID][1] 

下面是从外部的结果选择:

enter image description here

这里的(自身数据表Y)从内部选择的结果: enter image description here

+0

嗨,你的查询有点不同。每次搜索的费用将在用户数据包表中。在你的例子中,每月有3次搜索,但是它返回的结果不正确。在第3次搜索之后进行额外的搜索,它应该返回isinlimit = 0.另外,如果我在该年的其他月份添加一些搜索记录,那么 - 它应该相应地工作那几个月也是如此。感谢您的回复..您可以请进行一些更改,以帮助我。 – 2012-02-25 17:05:46

+0

另外我想整个一年的数据与计数。主要问题当我为那一年的每个月进行分区时,我正在那里。 – 2012-02-25 17:13:28