首页 > 解决方案 > 创建一个函数来获取 SQL 中的平均值?

问题描述

我有以下行的表格

表格1:

id  col1   col2  date
1   ttx   123    13-05-2020 
2   abc   436    13-05-2020 
1   ccy   879    13-05-2020 

下面是有历史记录的主表。

表 2

date        col1  col3  col4
13-05-2020   xyz   ttx  1
13-05-2020   xyz   abc  2
13-05-2020   xyz   ccy  3
--------
13-05-2019   xyz   ttx  1
13-05-2019   xyz   abc  2
13-05-2019   xyz   ccy  3

------

col1表 1 和col3表 2 的数据相似。

预期输出:

id  col1   col2  date          average
1   xyz   123    13-05-2020    1

我正在创建一个函数,该函数将col1anddate作为输入并返回平均值。

CREATE  FUNCTION [dbo].fn_GetData
    (
      @date DATE ,
      @col1 VARCHAR(10)
    )
RETURNS INT
AS
    BEGIN
        DECLARE @result INT;    
        DECLARE @previousdate DATE;
        SET @previousdate = DATEADD(YEAR, -1, CAST(@date AS DATE));

        WITH    cte1
                  AS ( SELECT   *
                       FROM     table2
                       WHERE    date = @date
                                AND col3 = @col1
                       UNION
                       SELECT   *
                       FROM     table2
                       WHERE    date = @previousdate
                                AND col3 = @col1
                     )
            SELECT  @result = 1 / AVG(cte1.col4)
            FROM    cte1; 

        RETURN @result;
    END;   

有更好的方法吗?

标签: sqlsql-servertsql

解决方案


如果您在很多地方不需要,则不需要计算平均值的功能。您可以使用以下查询来获取平均值。

SELECT t1.id, t1.col1,ot.col4_avg as [average]
FROM table1 AS t1
CROSS APPLY 
(
SELECT Avg(CAST(col4 AS DECIMAL(14,2))) as col4_avg
FROM table2 as t2
WHERE t2.date = t1.date and t2.col3 = t1.col1
) as ot(col4_avg)

推荐阅读