在前一段时间中遇到一个需求..统计某一种商品在某一天中的销售数量,当天没有销售的时候,数量显示0.
这个不能用一般的Group来实现.所以需要变通一下,跟一个有1-31的一个集合来Group.
有2种方案.
planA:
- SELECT SUM(ISNULL(BidsTrade_Money, 0))
- AS [MONEY], a.number
- AS [DAY]FROM MASTER..spt_values a
- LEFT JOIN DDPM_T_Comm_BidsTrade b
- ON a.type = 'p'
- AND month([BidsTrade_DateCreated])='5'
- AND a.number = DAY(b.[BidsTrade_DateCreated])
- AND YEAR([BidsTrade_DateCreated]) = '2010'
- WHERE a.number BETWEEN 1 AND 31GROUP BY a.numberorder by DAY
使用MASTER..spt_values(产生一定范围的数字的数字,这里需要产生1-31的数字.)
但是这一种方法有缺陷,每一个月不一定都是31天.并且我们配置的SQL账号不一定有权限来访问这个函数.
planB:.通过自定义函数.
自定义函数GetOrderType(比较长- -..)
- CREATE function [dbo].[CN80s_FN_GetOrderType]( @tabName nvarchar(2000),
- @keyOrder nvarchar(255))returns nvarchar(100)asbegin declare @OrderTable nvarchar(255) --表名
- declare @OrderName nvarchar(255) --字段名
- declare @OrderType nvarchar(255) --字段类型
- declare @Orderprec nvarchar(50) --字段长度
- declare @OrderDot int --点的位置
- declare @s1 nvarchar(100) -- 临时变量1
- declare @s2 nvarchar(100) -- 临时变量2 --去除排序规则
- set @keyorder=REPLACE(@keyorder, ' asc', '') --求表名、字段名
- set @OrderDot=CHARINDEX('.', @keyorder)
- IF @OrderDot > 0
- BEGIN
- SET @OrderTable = SUBSTRING(@keyorder, 0, @OrderDot)
- SET @OrderName = SUBSTRING(@keyorder, @OrderDot + 1, LEN(@keyorder))
- END
- ELSE
- BEGIN
- SET @OrderTable = @tabName
- SET @OrderName = @keyorder
- END --去除方括号 set @s1=REPLACE(REPLACE (@OrderTable,'[',''),']','')
- set @s2=REPLACE(REPLACE (@OrderName,'[',''),']','') --求字段类型、字段长度
- SELECT @OrderType=t.[name], @OrderPrec=c.prec
- FROM sysobjects o
- JOIN syscolumns c on o.id=c.id
- JOIN systypes t on c.xusertype=t.xusertype
- W
关键词标签:SQL Server
相关阅读
热门文章 SqlServer2005对现有数据进行分区具体步骤sql server系统表损坏的解决方法MS-SQL2005服务器登录名、角色、数据库用户Access、SQL Server、Oracle常见应用的区别
人气排行 如何远程备份(还原)SQL2000数据库SQL2000数据库远程导入(导出)数据配置和注册ODBC数据源-odbc数据源配置教程SQL2000和SQL2005数据库服务端口查看或修改SQL Server 2005降级到2000的正确操作步骤修改Sql Server唯一约束教程浅谈JSP JDBC来连接SQL Server 2005的方法SQL Server创建表语句介绍
查看所有0条评论>>