日期:2014-05-18  浏览次数:20501 次

100分求一条SQL,是在搞不定了
先有3个表,用户表/礼物表/礼物赠送记录表

userinfo用户表字段如下:
-------------------
userid username
-------------------
  1 小王
  2 小李
-------------------

gift礼物表字段如下:
-------------------
giftid giftname  
-------------------
  1 鲜花
  2 巧克力
  3 飞机
  4 航母
-------------------

sendgift礼物赠送记录表字段如下:
-----------------------------------------------------------
sendid send_giftid(礼物id) send_getuserid(接收人用户id) send_num(礼物数量) send_time
-----------------------------------------------------------
  1 4 2 11 2012-1-1
  2 2 1 21 2012-1-1
  3 1 2 13 2012-1-1
  4 3 2 4 2012-1-1
  5 2 1 5 2012-1-1
  6 2 1 51 2012-1-1
-----------------------------------------------------------


要求如下:

查询 [每个] 礼物 [一周] 内接收 [总数量] 最多的用户

如:
---------------------------------------------
  (giftname)礼物名称 (userid)用户ID (username)用户昵称 (SumNum)总数量
---------------------------------------------
  鲜花 2 小李 77
  巧克力 1 小王 13
  ... ... ... ...
---------------------------------------------




------解决方案--------------------
SQL code
if object_id('[userinfo]') is not null drop table [userinfo]
go
create table [userinfo]([userid] int,[username] varchar(4))
insert [userinfo]
select 1,'小王' union all
select 2,'小李'
go
if object_id('[gift]') is not null drop table [gift]
go
create table [gift]([giftid] int,[giftname] varchar(6))
insert [gift]
select 1,'鲜花' union all
select 2,'巧克力' union all
select 3,'飞机' union all
select 4,'航母'
go
if object_id('[sendgift]') is not null drop table [sendgift]
go
create table [sendgift]([sendid] int,[send_giftid] int,[send_getuserid] int,[send_num] int,[send_time] datetime)
insert [sendgift]
select 1,4,2,11,'2012-1-1' union all
select 2,2,1,21,'2012-1-1' union all
select 3,1,2,13,'2012-1-1' union all
select 4,3,2,4,'2012-1-1' union all
select 5,2,1,5,'2012-1-1' union all
select 6,2,1,51,'2012-1-1'
go

with cte as(
select b.giftname,a.userid,a.username,sum(send_num) as SumNum
from sendgift c
join userinfo a on a.userid=c.send_getuserid
join gift b on b.giftid=c.send_giftid
--where 一周内时间条件在这里添加
group by b.giftname,a.userid,a.username
)
select giftname,userid,username,SumNum
from
(
select *,rn=row_number() over(partition by giftname order by sumnum desc) from cte
) t
where rn=1
order by SumNum desc

/**
giftname userid      username SumNum
-------- ----------- -------- -----------
巧克力      1           小王       77
鲜花       2           小李       13
航母       2           小李       11
飞机       2           小李       4

(4 行受影响)
**/

------解决方案--------------------
SQL code
select gift.giftname as 礼物名称,userinfo.userid as 用户ID,userinfo.username as 用户昵称,topinfo.send_count as 总数量
from 
(
    select *
    from
    (
        select row_number() over(partition by send_giftid order by send_giftid,sum(send_num) desc) as topShow, send_giftid,send_getuserid,sum(send_num) as send_count
        from sendgift
        where DATEDIFF(D,