zoukankan      html  css  js  c++  java
  • 排行榜处理示例.sql

    --图书销售数据表
    CREATE TABLE tb(
    Books nvarchar(30), --书名
    Date datetime,     --销售日期
    Sales int)         --销售数量
    --生成测试数据
    INSERT tb SELECT
        CHAR(65+RAND(CHECKSUM(NEWID()))*25),
        DATEADD(Day,1-RAND(CHECKSUM(NEWID()))*500,GETDATE()),
        RAND(CHECKSUM(NEWID()))*360
    FROM sysobjects a,sysobjects b
    --显示数据
    SELECT * FROM tb
    GO

    --排行榜处理的存储过程
    CREATE PROC p_Qry
    @Type  nchar(1)=N'日',  --排行榜处理类型(日、周、月、季、年)
    @Date  datetime=null,   --排行榜日期,不指定为当前日期
    @TopN int=10          --记录数
    AS
    SET NOCOUNT ON
    DECLARE @p_dt_begin datetime,@dt_begin datetime

    --参数检测
    IF CHARINDEX(@Type,N'日周月季年')=0
        SET @Type=N'日'
    IF @Date IS NULL
        SET @Date=CONVERT(char(10),GETDATE(),120)
    ELSE
        SET @Date=CONVERT(char(10),@Date,120)
    IF ISNULL(@TopN,0)<1
        SET @TopN=10

    --根据@Type决定计算的起始日期
    IF @Type=N'日'
        SELECT
            @dt_begin=@Date,
            @Date=DATEADD(Day,1,@Date),
            @p_dt_begin=DATEADD(Day,-1,@dt_begin)
    ELSE IF @Type=N'周'
        SELECT
            @dt_begin=DATEADD(Day,-(DATEPART(Weekday,@Date)+@@DATEFIRST-2)%7,@Date),
            @Date=DATEADD(Day,7,@dt_begin),
            @p_dt_begin=DATEADD(Day,-7,@dt_begin)
    ELSE IF @Type=N'月'
        SELECT
            @dt_begin=CONVERT(char(8),@Date,120)+'01',
            @Date=DATEADD(Month,1,@dt_begin),
            @p_dt_begin=DATEADD(Month,-1,@dt_begin)
    ELSE IF @Type=N'季'
        SELECT
            @dt_begin=CONVERT(char(8),
                DATEADD(Month,DATEPART(Quarter,@Date)*3-Month(@Date)-2,@Date),
                120)+'1',
            @Date=DATEADD(Month,3,@dt_begin),
            @p_dt_begin=DATEADD(Month,-3,@dt_begin)
    ELSE
        SELECT
            @dt_begin=CONVERT(char(5),@Date,120)+'01-01',
            @Date=DATEADD(Year,1,@dt_begin),
            @p_dt_begin=DATEADD(Year,-1,@dt_begin)

    --取排名数据到临时表
    SET ROWCOUNT @TopN
    --最新名称
    SELECT Books,Sales_Amount=SUM(Sales)
    INTO #1 FROM tb
    WHERE Date>=@dt_begin AND Date<@Date
    GROUP BY Books
    ORDER BY Sales_Amount DESC
    --上期名次
    SELECT Books,Sales_Amount=SUM(Sales)
    INTO #2 FROM tb
    WHERE Date>=@p_dt_begin AND Date<@dt_begin
    GROUP BY Books
    ORDER BY Sales_Amount DESC

    --显示结果
    SELECT a.Books,a.Sales_Amount,a.Place,
        Description=CASE
            WHEN b.Books IS NULL THEN N'↑新上榜'
            WHEN a.Place=b.Place THEN N'-'
            WHEN a.Place>b.Place THEN N'↓'+RTRIM(a.Place-b.Place)+N'位'
            ELSE N'↑'+RTRIM(b.Place-a.Place)+N'位' END,b.*
    FROM(
        SELECT Books,Sales_Amount,
            Place=(SELECT COUNT(Sales_Amount) FROM #1 WHERE Sales_Amount>aa.Sales_Amount)+1
        FROM #1 aa
    )a LEFT JOIN(
        SELECT Books,
            Place=(SELECT COUNT(Sales_Amount) FROM #2 WHERE Sales_Amount>aa.Sales_Amount)+1
        FROM #2 aa
    )b ON a.Books=b.Books
    ORDER BY a.Place
    GO

    --调用
    EXEC p_Qry N'日'
    EXEC p_Qry N'周'
    EXEC p_Qry N'月'
    EXEC p_Qry N'季'
    EXEC p_Qry N'年'
  • 相关阅读:
    linux进程调度(zz)
    为什么vfork的子进程里用return,整个程序会挂掉,而且exit不会(zz)
    ubuntu安装samba
    【前端知乎系列】ArrayBuffer 和 Blob 对象
    【Web技术】442- 关于图片懒加载的几种方案
    【Web技术】441- 蚂蚁前端研发最佳实践
    【面试题】440- 10 道 Nodejs EventLoop 和事件相关面试题
    【面试题】439- 这是一道网红面试题
    【Web技术】438- 移动端体验优化经验总结与实践
    记 · 寒风依旧 · 虎跑路和人生路
  • 原文地址:https://www.cnblogs.com/shihao/p/2509631.html
Copyright © 2011-2022 走看看