自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解決SQL Server中Group無法實(shí)現(xiàn)的問題

數(shù)據(jù)庫 SQL Server
本文將解決SQL Server中一個SQL Group不能解決的問題,提出了兩種不同的方案供大家來參考。

在前一段時間中遇到一個需求..統(tǒng)計(jì)某一種商品在某一天中的銷售數(shù)量,當(dāng)天沒有銷售的時候,數(shù)量顯示0.

這個不能用一般的Group來實(shí)現(xiàn).所以需要變通一下,跟一個有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(產(chǎn)生一定范圍的數(shù)字的數(shù)字,這里需要產(chǎn)生1-31的數(shù)字.)

列

但是這一種方法有缺陷,每一個月不一定都是31天.并且我們配置的SQL賬號不一定有權(quán)限來訪問這個函數(shù).

planB:.通過自定義函數(shù).

自定義函數(shù)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  --點(diǎn)的位置      
  7. declare @s1 nvarchar(100) -- 臨時變量1      
  8. declare @s2 nvarchar(100) -- 臨時變量2    --去除排序規(guī)則    
  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 

函數(shù)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



CREATE function [dbo].[FormatDateTime](@Date datetime,@formatStr varchar(20))
returns varchar(16)
as
begin
declare @tempstr varchar(20),@index int,@retStr varchar(20),@formatLen int,@str1 varchar(6),@str2 varchar(6),@str3 varchar(6),@j int
declare @tempformat varchar(20)
select @tempformat=@formatStr,@formatStr = Upper(@formatStr),@index=-1,@retstr=''
if @formatStr='MM/DD/YYYY'
set @retstr= convert(varchar(10),@date,101)
else if @formatstr='YYYY-MM-DD'
set @retstr = Convert(char(10),@Date,20)
else if @formatStr='YYYY.MM.DD'
set @retstr= Convert(varchar(10),@Date,102)
else if @formatStr='YYYY/MM/DD'
set @retstr= Convert(varchar(10),@Date,111)
else if @formatStr='DD/MM/YYYY'
set @retstr= Convert(varchar(10),@Date,103)
else if @formatStr='DD.MM.YYYY'
set @retstr= Convert(varchar(10),@Date,104)
else if @formatStr='DD-MM-YYYY'
set @retstr= Convert(varchar(10),@Date,105)
else if @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
else set @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

可以看看調(diào)用這個函數(shù)的結(jié)果.

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

參數(shù)依次為:開始時間,結(jié)束時間,顯示狀態(tài)(null:顯示所有日期,0顯示所有工作日(星期一~星期五),1:顯示周末,2顯示周末)

函數(shù)結(jié)果

當(dāng)然這個函數(shù)有其他的擴(kuò)展應(yīng)用請各位看官天馬行空.~

實(shí)際應(yīng)用,這里寫了一個存儲過程 

  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 

原文標(biāo)題:一個SQL Group問題

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

【編輯推薦】
  1. SQL Server數(shù)據(jù)庫和Oracle行轉(zhuǎn)列的特殊方案描述
  2. SQL Server行轉(zhuǎn)列的什么情況下被用?
  3. SQL Server實(shí)例中對另個實(shí)例的調(diào)用
  4. SQL Server identity列,美中不足之處
  5. SQL Server DateTime數(shù)據(jù)類型的另類解讀

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2010-11-09 17:09:23

SQL Server中

2010-06-29 17:04:37

SQL Server警

2010-06-18 09:31:51

SQL Server數(shù)

2010-10-21 15:57:37

SQL Server無

2010-11-08 11:57:58

2010-06-30 14:15:08

SQL Server死

2010-07-09 14:51:21

SQL Server

2010-06-28 11:06:04

SQL Server

2010-06-17 14:16:24

SQL Server補(bǔ)

2011-09-02 10:53:31

SQL Server 還原日志備份差異備份

2011-07-11 09:54:16

DAC登錄觸發(fā)器

2010-08-31 13:56:38

PHP5多線程

2010-10-19 13:05:31

Sql Server遠(yuǎn)

2010-09-07 11:53:00

SQL語句

2010-07-26 16:39:57

SQL Server

2013-12-05 09:45:04

HadoopHadoop架構(gòu)圖

2009-05-26 10:21:07

2010-07-05 14:41:21

SQL Server數(shù)

2010-10-21 09:43:15

2010-10-20 17:21:07

連接SQL Serve
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號