--图书销售数据表
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'年'
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'年'
解决方案 »
- 急 急 无法还原
- 如何将没有找出来的记录,显示默认为零呢?
- 求一个case语句
- 如何在一个表中的某个列后面增加一个新的字段
- sqlserver2005 数据库优化database engine tuning advisor问题
- [Microsoft][ODBC SQL Server Driver][Shared Memory]SQL Server 不存在或访问被拒绝
- 怎样查询一段固定时间的数据?????
- 一个数据输入的问题_高分有送
- 在 SQL 语句中用了 SELECT 字段=CASE 字段.....,用记录集保存时出错,为什么?
- DTS
- 求以SQL语句,请达人相助!!!
- 求助:该SQL存储过程用C#如何实现
--按一个周的**********************************************
where DATEDIFF(wk, selldate, getdate())=0 and dealstatus=1
--********************************************************
--group by commodityid
sdhdy 我执行你写的sql怎么就出来2条记录
如果查本周的这样设计就可以了。查询也是对的!只要DATEDIFF(wk, selldate, getdate())=0就可以了