常用的数据库统计SQL语句(2)
作者:admin 日期:2009-04-01
1.解决被零除(零做除数时)
--来自百度问吧
在统计系统中,需要求百分数,
如(sum(baseprice)-sum(quote))/sum(baseprice)*100)中,
如果sum(baseprice)为0,系统会报错,不能运行
把sum(baseprice) 改为
nullif(sum(isnull(baseprice,0)),0)
就可以了,除于0会出错,除于null就不会出错了
2.列出某年1-12月数据各产吕的销售数据
Select 产品ID AS 机型, SUM(CASE month(日期) WHEN 1 THEN 销售量 ELSE 0 END)
AS [一月], SUM(CASE month(日期) WHEN 2 THEN 销售量 ELSE 0 END) AS [二月],
SUM(CASE month(日期) WHEN 3 THEN 销售量 ELSE 0 END) AS [三月],
SUM(CASE month(日期) WHEN 4 THEN 销售量 ELSE 0 END) AS [四月],
SUM(CASE month(日期) WHEN 5 THEN 销售量 ELSE 0 END) AS [五月],
SUM(CASE month(日期) WHEN 6 THEN 销售量 ELSE 0 END) AS [六月],
SUM(CASE month(日期) WHEN 7 THEN 销售量 ELSE 0 END) AS [七月],
SUM(CASE month(日期) WHEN 8 THEN 销售量 ELSE 0 END) AS [八月],
SUM(CASE month(日期) WHEN 9 THEN 销售量 ELSE 0 END) AS [九月],
SUM(CASE month(日期) WHEN 10 THEN 销售量 ELSE 0 END) AS [十月],
SUM(CASE month(日期) WHEN 11 THEN 销售量 ELSE 0 END) AS [十一月],
SUM(CASE month(日期) WHEN 12 THEN 销售量 ELSE 0 END) AS [十二月]
FROM DezaiCN_Sale
Where datepart(year, 日期) = 2008
GROUP BY 产品ID
3.数据同比 环比分析
(参考邹捷的SQL)
Create procedure DezaiCn_SaleAnalysisCompareByDate
@compareMonth int
as
--统计处理
declare @o_dt1 datetime,@o_dt2 datetime,
@n_dt1 datetime,@beginStasticDate datetime,@endStasticDate datetime
--计算各期的统计时间
select
@beginStasticDate=cast(@compareMonth*100+1 as char(8)), --本期统计的开始日期
@endStasticDate=dateadd(month,1,@beginStasticDate), --本期统计的结束日期
@n_dt1=dateadd(month,-1,@beginStasticDate), --上期统计的开始日期
@o_dt1=dateadd(year,-1,@beginStasticDate), --去年同期统计的开始日期
@o_dt2=dateadd(month,1,@o_dt1) --去年同期统计的结束日期
select
店铺名=isnull(a.店铺名,b.店铺名),
本期开始=CONVERT(varchar(12) , @beginStasticDate, 102 ),
本期结束=CONVERT(varchar(12) , @endStasticDate, 102 ),
上期结束=CONVERT(varchar(12) , @n_dt1, 102 ),
本期=isnull(b.销售量2,0),
上期=isnull(b.销售量1,0),
上期差异=isnull(b.销售量2,0)-isnull(b.销售量1,0) ,
去年开始=CONVERT(varchar(12) , @o_dt1, 102 ),
去年结束=CONVERT(varchar(12) , @o_dt2, 102 ),
去年同期=isnull(a.销售量,0),
去年同期差异=isnull(b.销售量2,0)-isnull(a.销售量,0)
from(
--去年同期的统计
select 店铺名,销售量=sum(销售量)
from DezaiCn_Sale
where 日期 between @o_dt1 and @o_dt2
group by 店铺名
)a full join(
--今年及上期统计
select 店铺名,
销售量1=sum(case when 日期<@beginStasticDate then 销售量 end),
销售量2=sum(case when 日期>@beginStasticDate then 销售量 end)
from DezaiCn_Sale
where 日期 between @n_dt1 and @endStasticDate
group by 店铺名,店铺名
)b on a.店铺名=b.店铺名
GO
执行
DECLARE @RC int
DECLARE @compareMonth int
Select @compareMonth = 200903
EXEC @RC = [TEST].[dbo].[DezaiCn_SaleAnalysisCompareByDate] @compareMonth
DECLARE @PrnLine nvarchar(4000)
PRINT '存储过程: TEST.dbo.DezaiCn_SaleAnalysisCompareByDate'
Select @PrnLine = ' 返回代码 = ' + CONVERT(nvarchar, @RC)
PRINT @PrnLine
--来自百度问吧
在统计系统中,需要求百分数,
如(sum(baseprice)-sum(quote))/sum(baseprice)*100)中,
如果sum(baseprice)为0,系统会报错,不能运行
把sum(baseprice) 改为
nullif(sum(isnull(baseprice,0)),0)
就可以了,除于0会出错,除于null就不会出错了
2.列出某年1-12月数据各产吕的销售数据
Select 产品ID AS 机型, SUM(CASE month(日期) WHEN 1 THEN 销售量 ELSE 0 END)
AS [一月], SUM(CASE month(日期) WHEN 2 THEN 销售量 ELSE 0 END) AS [二月],
SUM(CASE month(日期) WHEN 3 THEN 销售量 ELSE 0 END) AS [三月],
SUM(CASE month(日期) WHEN 4 THEN 销售量 ELSE 0 END) AS [四月],
SUM(CASE month(日期) WHEN 5 THEN 销售量 ELSE 0 END) AS [五月],
SUM(CASE month(日期) WHEN 6 THEN 销售量 ELSE 0 END) AS [六月],
SUM(CASE month(日期) WHEN 7 THEN 销售量 ELSE 0 END) AS [七月],
SUM(CASE month(日期) WHEN 8 THEN 销售量 ELSE 0 END) AS [八月],
SUM(CASE month(日期) WHEN 9 THEN 销售量 ELSE 0 END) AS [九月],
SUM(CASE month(日期) WHEN 10 THEN 销售量 ELSE 0 END) AS [十月],
SUM(CASE month(日期) WHEN 11 THEN 销售量 ELSE 0 END) AS [十一月],
SUM(CASE month(日期) WHEN 12 THEN 销售量 ELSE 0 END) AS [十二月]
FROM DezaiCN_Sale
Where datepart(year, 日期) = 2008
GROUP BY 产品ID
3.数据同比 环比分析
(参考邹捷的SQL)
复制内容到剪贴板 程序代码
Create procedure DezaiCn_SaleAnalysisCompareByDate
@compareMonth int
as
--统计处理
declare @o_dt1 datetime,@o_dt2 datetime,
@n_dt1 datetime,@beginStasticDate datetime,@endStasticDate datetime
--计算各期的统计时间
select
@beginStasticDate=cast(@compareMonth*100+1 as char(8)), --本期统计的开始日期
@endStasticDate=dateadd(month,1,@beginStasticDate), --本期统计的结束日期
@n_dt1=dateadd(month,-1,@beginStasticDate), --上期统计的开始日期
@o_dt1=dateadd(year,-1,@beginStasticDate), --去年同期统计的开始日期
@o_dt2=dateadd(month,1,@o_dt1) --去年同期统计的结束日期
select
店铺名=isnull(a.店铺名,b.店铺名),
本期开始=CONVERT(varchar(12) , @beginStasticDate, 102 ),
本期结束=CONVERT(varchar(12) , @endStasticDate, 102 ),
上期结束=CONVERT(varchar(12) , @n_dt1, 102 ),
本期=isnull(b.销售量2,0),
上期=isnull(b.销售量1,0),
上期差异=isnull(b.销售量2,0)-isnull(b.销售量1,0) ,
去年开始=CONVERT(varchar(12) , @o_dt1, 102 ),
去年结束=CONVERT(varchar(12) , @o_dt2, 102 ),
去年同期=isnull(a.销售量,0),
去年同期差异=isnull(b.销售量2,0)-isnull(a.销售量,0)
from(
--去年同期的统计
select 店铺名,销售量=sum(销售量)
from DezaiCn_Sale
where 日期 between @o_dt1 and @o_dt2
group by 店铺名
)a full join(
--今年及上期统计
select 店铺名,
销售量1=sum(case when 日期<@beginStasticDate then 销售量 end),
销售量2=sum(case when 日期>@beginStasticDate then 销售量 end)
from DezaiCn_Sale
where 日期 between @n_dt1 and @endStasticDate
group by 店铺名,店铺名
)b on a.店铺名=b.店铺名
GO
执行
复制内容到剪贴板 程序代码
DECLARE @RC int
DECLARE @compareMonth int
Select @compareMonth = 200903
EXEC @RC = [TEST].[dbo].[DezaiCn_SaleAnalysisCompareByDate] @compareMonth
DECLARE @PrnLine nvarchar(4000)
PRINT '存储过程: TEST.dbo.DezaiCn_SaleAnalysisCompareByDate'
Select @PrnLine = ' 返回代码 = ' + CONVERT(nvarchar, @RC)
PRINT @PrnLine
[本日志由 admin 于 2009-03-31 04:14 PM 编辑]
上一篇: Oracle学习:Oracle常用函数集下一篇: 《当下的力量》读后感
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 数据库统计SQL语句
相关日志:
评论: 0 | 引用: 0 | 查看次数: 7323
发表评论