首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一统计函数,有需求和期望结果举例

2012-12-20 
求一统计函数,有需求和期待结果举例应用需求:日期酒店名称备注价格2012-01-28商务酒店全含802012-01-29商

求一统计函数,有需求和期待结果举例

应用需求:
日期        酒店名称    备注    价格
2012-01-28  商务酒店    全含    80
2012-01-29  商务酒店    全含    80
2012-01-30  商务酒店    全含    80
2012-01-31  新天地酒店  含早    110

期待结果:
28、29、30 商务酒店 全含 80 / 31 新天地酒店 含早 110

求一函数,输出以上结果,其中关联外键PartyID

目前写了个简单的类似函数


ALTER   Function   [dbo].[f_getPlanHotel](@ID   Int)     
  Returns   Nvarchar(400)     
  As     
  Begin     
          Declare   @S   Nvarchar(400)     
          Set   @S=''     
          Select   @S=@S + '/' + ' ' + DateName(day,date) + '、' + [Name] + ' ' + [desc] + ' ' + cast(CAST(Price AS int) as varchar(10)) + ' ' from   PartyPlanHotel Where   PartyID=@ID    
          Return   ltrim((Stuff(@S,1,1,'')))
  End     

测试的结果是:
28、象山商务 全含 80 / 29、象山商务 全含 80 / 30、象山商务 全含 80 / 31、阳朔新天地 含早 110 

求一实现期待结果的函数
[最优解释]

CREATE FUNCTION ff (@ID INT)
RETURNS VARCHAR(400)
AS 
BEGIN 
DECLARE @S NVARCHAR(400);
WITH  cte AS
(
SELECT  [日期] = STUFF((
  SELECT '、'+ DATENAME (dd , [日期]) FROM [tb] WHERE [酒店名称]= t.[酒店名称] AND [备注]= t.[备注]AND [价格]= t.[价格]  FOR XML PATH('')
 ) , 1 , 1 , '') , [酒店名称] , [备注] , CONVERT(VARCHAR(10) , [价格]) AS [价格]
FROM    [tb] AS t
-- Where PartyID=@ID 
GROUP BY [酒店名称] , [备注] , [价格]
)
SELECT  @S = ISNULL(@S + ' / ' , '') + [日期] + ' ' + [酒店名称] + ' ' + [备注] + ' ' + [价格]
FROM    cte 
RETURN @S
END 
SELECT dbo.ff(1)

[其他解释]
这个可以按照 酒店名称 备注 价格 排序,然后遍历取数据分别赋值给3个变量 ,
当下一条和上一条不等 说明该+‘/’分隔了,一样 就把日期串起来。思路已有!
[其他解释]
引用:
应用需求:
日期        酒店名称    备注    价格
2012-01-28  商务酒店    全含    80
2012-01-29  商务酒店    全含    80
2012-01-30  商务酒店    全含    80


2012-01-31  新天地酒店  含早    110

期待结果:
28、29、30 商务酒店 全含 80 / 31 新天地酒店 含早 11……



请见我在这个帖子里的回复http://topic.csdn.net/u/20120625/18/32f2d89c-6b04-41fc-9f62-3bea0648cedd.html

其中charindex处完善的应该是charindex(','+**+',',','+**+',')

[其他解释]

--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([日期] DATETIME,[酒店名称] VARCHAR(10),[备注] VARCHAR(4),[价格] INT)
INSERT [tb]
SELECT '2012-01-28','商务酒店','全含',80 UNION ALL
SELECT '2012-01-29','商务酒店','全含',80 UNION ALL
SELECT '2012-01-30','商务酒店','全含',80 UNION ALL
SELECT '2012-01-31','新天地酒店','含早',110
--------------开始查询--------------------------

  Declare @S Nvarchar(400)   
  ; WITH cte AS 
  (
  SELECT [日期]=STUFF((SELECT '、'+DATENAME(dd,[日期]) FROM  [tb] WHERE [酒店名称]=t.[酒店名称] AND  [备注]=t.[备注]AND [价格]=t.[价格] FOR XML PATH('')),1,1,''),
  [酒店名称], [备注],CONVERT(VARCHAR(10),[价格]) AS [价格] from [tb] AS t
  -- Where PartyID=@ID 
  GROUP BY  [酒店名称], [备注],[价格]
  )
  SELECT @S=ISNULL(@S+' / ','')+[日期]+' '+[酒店名称]+' '+[备注]+' '+[价格] FROM cte 
  SELECT @S
  
----------------结果----------------------------
/* 
28、29、30 商务酒店 全含 80 / 31 新天地酒店 含早 110
*/

[其他解释]
该回复于2012-10-24 08:49:58被版主删除
[其他解释]
效果是可以实现,但测试效果发现执行速度较慢,主从表中的数据量都未超过十万条,使用屏蔽的代码速度要比使用的速度快很多,不知还有更好的处理方案或改善的代码

ALTER   Function   [dbo].[f_getPlanHotel](@ID   Int)     
  Returns   Nvarchar(400)     
  As     
  Begin     

    DECLARE @S NVARCHAR(400);
    WITH  cte  AS
    (
        SELECT  [date] = STUFF((
                              SELECT '、'+ DATENAME (day , [date]) FROM PartyPlanHotel WHERE  PartyID=@ID and [Name]= t.[Name] AND [desc]= t.[desc]AND Price= t.Price  FOR XML PATH('')
                             ) , 1 , 1 , '') , [Name] , [desc] ,  Price
        FROM    PartyPlanHotel AS t
where PartyID=@ID     
        GROUP BY [Name] , [desc] , Price
    )
    SELECT  @S = ISNULL(@S + ' / ' , '') + date + ' ' + [Name] + ' ' + [desc] + ' ' + cast(CAST(Price AS int) as varchar(10))


    FROM    cte  
    RETURN @S

/*
          Declare   @S   Nvarchar(400)     
          Set   @S=''     
          Select   @S=@S + '/' + ' ' + DateName(day,date) + '、' + [Name] + ' ' + [desc] + ' ' + cast(CAST(Price AS int) as varchar(10)) + ' ' from   PartyPlanHotel Where   PartyID=@ID    
          Return   ltrim((Stuff(@S,1,1,'')))
*/
  End     

热点排行