科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用SQL Server Having计算列和平均值(2)

用SQL Server Having计算列和平均值(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

做为一名数据库语言和用法教师,我发现一些特别难以解释的主题。其中的一个主题为SQL Server的Having子句。

作者:builder.com.cn 来源:builder.com.cn 2007年9月4日

关键字: HAVING SQL Server SQL Server 各版本 数据库

  • 评论
  • 分享微博
  • 分享邮件

你可以将平均值的计算过程进行分解来解决这个问题。你可以将第一部分(SUM)编写成一个表值UDF,如列表C所示。你可以根据列表D中的函数计算平均值。列表E说明你如何能够进行组合。

USE [AdventureWorks]
GO
/****** Object:  UserDefinedFunction 
[dbo].[SalesTotals_fnt]    
Script Date: 12/09/2006 11:32:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[SalesTotals_fnt]()
RETURNS TABLE
AS RETURN      
(SELECT SalesOrderID, 
SUM(LineTotal)AS TotalSale      
FROM Sales.SalesOrderDetail      
GROUP BY Sales.SalesOrderDetail.SalesOrderID)

列表C

CREATE FUNCTION [dbo].[AverageSale_fns] (      
-- Add the parameters for the function here      
--  )RETURNS money
ASBEGIN      
-- Declare the return variable here      
DECLARE @Result money
-- Add the T-SQL statements to compute the return value here      
SET @Result =(SELECTAvg(TotalSale)AS AverageSale      
FROM dbo.SalesTotals_fnt())
-- Return the result of the function      
RETURN @Result
END

列表D

DECLARE @Avg moneySELECT @Avg = dbo.AverageSale_fns()
SELECT       *, @Avg as Average,      
TotalSale / @Avg as Ratio,      CASE             
WHEN TotalSale / @Avg > 1 THEN 'Above Average'           
 WHEN TotalSale / @Avg < 1 THEN 'Below Average'            
ELSE 'Average'      END
FROM dbo.SalesTotals_fnt()

列表E

现在你知道了如何根据一个子表使用Having子句来测试合计值。当你需要在一个查询中使用两个不同的合计函数时,最好是把它们分解成单独的函数,然后再进行组合(如前一个例子所说明的)。

与典型编程一样,使每个函数专注于一件事情。然后,你就可以应用它们,并可不断重复应用。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章