科技行者

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

知识库

知识库 安全导航

至顶网软件频道如何在SQL Server计算机列和平均值(2)

如何在SQL Server计算机列和平均值(2)

  • 扫一扫
    分享文章到微信

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

严格来说,Having并不需要一个子表,但没有子表的Having并没有实际意义。如果你只需要一个表,那么你可以用Where子句达到一切目的。

作者:keeshow 来源:赛迪网-IT博客 2007年8月29日

关键字: 平均值 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

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