解决SQL Server中Group无法实现的问题

在前一段时间中遇到一个需求..统计某一种商品在某一天中的销售数量,当天没有销售的时候,数量显示0.

这个不能用一般的Group来实现.所以需要变通一下,跟一个有1-31的一个集合来Group.

有2种方案.

planA:

  1. SELECT SUM(ISNULL(BidsTrade_Money, 0))   
  2. AS [MONEY], a.number   
  3. AS [DAY]FROM MASTER..spt_values a      
  4. LEFT JOIN DDPM_T_Comm_BidsTrade b          
  5. ON  a.type = 'p'             
  6.  AND month([BidsTrade_DateCreated])='5'              
  7. AND a.number = DAY(b.[BidsTrade_DateCreated])              
  8. AND YEAR([BidsTrade_DateCreated]) = '2010'              
  9. WHERE a.number BETWEEN 1 AND 31GROUP BY a.numberorder by DAY 

使用MASTER..spt_values(产生一定范围的数字的数字,这里需要产生1-31的数字.)

但是这一种方法有缺陷,每一个月不一定都是31天.并且我们配置的SQL账号不一定有权限来访问这个函数.

planB:.通过自定义函数.

自定义函数GetOrderType(比较长- -..)

  1. CREATE function [dbo].[CN80s_FN_GetOrderType](    @tabName nvarchar(2000),      
  2. @keyOrder nvarchar(255))returns nvarchar(100)asbegin    declare @OrderTable nvarchar(255)  --表名     
  3.  declare @OrderName nvarchar(255)  --字段名      
  4. declare @OrderType nvarchar(255)  --字段类型      
  5. declare @OrderPrec nvarchar(50)  --字段长度      
  6. declare @OrderDot int  --点的位置      
  7. declare @s1 nvarchar(100) -- 临时变量1      
  8. declare @s2 nvarchar(100) -- 临时变量2    --去除排序规则    
  9. set @keyorder=REPLACE(@keyorder, ' asc', '')    --求表名、字段名      
  10. set @OrderDot=CHARINDEX('.', @keyorder)      
  11. IF @OrderDot > 0          
  12. BEGIN              
  13. SET @OrderTable = SUBSTRING(@keyorder, 0, @OrderDot)              
  14. SET @OrderName = SUBSTRING(@keyorder, @OrderDot + 1, LEN(@keyorder))         
  15. END      
  16. ELSE          
  17. BEGIN              
  18. SET @OrderTable = @tabName              
  19. SET @OrderName = @keyorder          
  20. END    --去除方括号    set @s1=REPLACE(REPLACE (@OrderTable,'[',''),']','')      
  21. set @s2=REPLACE(REPLACE (@OrderName,'[',''),']','')    --求字段类型、字段长度      
  22. SELECT @OrderType=t.[name], @OrderPrec=c.prec      
  23. FROM sysobjects o       
  24. JOIN syscolumns c on o.id=c.id      
  25. JOIN systypes t on c.xusertype=t.xusertype      
  26. WHERE o.name = @s1 AND c.[name] = @s2      
  27. if @OrderType is null    begin          
  28. SET @OrderType='Sql_Variant'      
  29. end    else    begin          
  30. IF CHARINDEX('char', @OrderType) > 0             
  31. SET @OrderType = @OrderType + '(' + CAST(@OrderPrec AS nvarchar) + ')'      
  32. end    return @OrderTypeendGO 

函数2(这个更长) 

USE[CN80s.DDPM]
GO

/****** Object: UserDefinedFunction [dbo].[FormatDateTime] Script Date: 08/01/2010 16:28:23 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATEfunction[dbo].[FormatDateTime](@Datedatetime,@formatStrvarchar(20))
returnsvarchar(16)
as
begin
declare@tempstrvarchar(20),@indexint,@retStrvarchar(20),@formatLenint,@str1varchar(6),@str2varchar(6),@str3varchar(6),@jint
declare@tempformatvarchar(20)
select@tempformat=@formatStr,@formatStr=Upper(@formatStr),@index=-1,@retstr=''
if@formatStr='MM/DD/YYYY'
set@retstr=convert(varchar(10),@date,101)
elseif@formatstr='YYYY-MM-DD'
set@retstr=Convert(char(10),@Date,20)
elseif@formatStr='YYYY.MM.DD'
set@retstr=Convert(varchar(10),@Date,102)
elseif@formatStr='YYYY/MM/DD'
set@retstr=Convert(varchar(10),@Date,111)
elseif@formatStr='DD/MM/YYYY'
set@retstr=Convert(varchar(10),@Date,103)
elseif@formatStr='DD.MM.YYYY'
set@retstr=Convert(varchar(10),@Date,104)
elseif@formatStr='DD-MM-YYYY'
set@retstr=Convert(varchar(10),@Date,105)
elseif@formatStr='YYYYMMDD'
set@retstr=Convert(varchar(10),@Date,112)
else
begin
select@tempformat=@formatStr,@formatLen=len(@formatStr)
if@formatLen>8
begin
set@index=charindex('M',@tempformat)
select@str1=right(left(@tempformat,@index-1),@index-5),@str2=right(@tempformat,@formatLen-@index-1)
select@index=charindex('D',@str2),@str3=@str2
set@str2=left(@str2,@index-1)
set@str3=right(@str3,len(@str3)-@index-1)
end
select@tempstr=Convert(char(10),@Date,20),@str1=isnull(@str1,''),@str2=isnull(@str2,''),@str3=isnull(@str3,''),@j=0
while@index<>0
begin
set@index=charindex('-',@tempstr)
if@j=0
select@retstr=left(@tempstr,@index-1)+@str1,@j=@j+1
elseset@retstr=@retstr+left(@tempstr,@index-1)+@str2
select@tempstr=right(@tempstr,len(@tempstr)-@index)
set@index=charindex('-',@tempstr)
end
set@retstr=@retstr+@tempstr+@str3
end
return@retstr
end


GO

可以看看调用这个函数的结果.

  1. SELECT * FROM CN80s_DDPM_FN_GETDATE('2010-05-1','2010-05-31',null

参数依次为:开始时间,结束时间,显示状态(null:显示所有日期,0显示所有工作日(星期一~星期五),1:显示周末,2显示周末)

当然这个函数有其他的扩展应用请各位看官天马行空.~

实际应用,这里写了一个存储过程 

  1. SELECT a.day , isnull(BidsCombo_Price,0) as   
  2. BidsCombo_Price, isnull( BidsTrade_Count,0) as    
  3. BidsTrade_CountFROM (          
  4. SELECT year(Dateas year,month(Dateas month,day(Dateas [day
  5. FROM dbo.CN80s_DDPM_FN_GETDATE(@beginTime,@endTime,NULL) ) a       
  6. LEFT JOIN          
  7. DDPM_V_BidsTradeRecount b         
  8.  ON  a.day = b.day          
  9. AND a.year=b.year          
  10. AND a.month=b.month    GO 

原文标题:一个SQL Group问题

链接:http://www.cnblogs.com/willsonchan/archive/2010/08/01/1789980.html

【编辑推荐】

  1. SQL Server数据库和Oracle行转列的特殊方案描述
  2. SQL Server行转列的什么情况下被用?
  3. SQL Server实例中对另个实例的调用
  4. SQL Server identity列,美中不足之处
  5. SQL Server DateTime数据类型的另类解读

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/262662.html<

(0)
管理的头像管理
上一篇2025-05-04 05:08
下一篇 2025-05-04 05:10

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注