【问题标题】:Add numbers from three different queries together将三个不同查询中的数字相加
【发布时间】:2019-03-06 06:43:39
【问题描述】:

我得到了过去 3 个月、6 个月和 10 个月的平均值。来自以下查询

select SUM(GrossAmount)/10 as Averageten  
FROM Table
WHERE CreatedDate >= DATEADD(MONTH, -10, GETDATE()) 

select SUM(GrossAmount)/6 as Averagesix  
FROM Table
WHERE CreatedDate >= DATEADD(MONTH, -6, GETDATE()) 

select SUM(GrossAmount)/3 as Averagethree  
FROM Table
WHERE CreatedDate >= DATEADD(MONTH, -3, GETDATE())

例如,我得到三个不同的值:

1200.22
2300.22
4500

我想像这样得到这三个值的平均值

(1200.22 + 2300.22 + 4500) / 3

如何从这些单独的查询中添加值。

【问题讨论】:

  • 从这些单独的查询中添加值是什么意思,您能详细说明一下吗

标签: sql sql-server sql-server-2008 group-by


【解决方案1】:

使用union合并三个查询,然后做平均

select avg(Averageten)
from
(select SUM(GrossAmount)/10 as Averageten  
FROM Table
WHERE CreatedDate >= DATEADD(MONTH, -10, GETDATE()) 
union
select SUM(GrossAmount)/6 
FROM Table
WHERE CreatedDate >= DATEADD(MONTH, -6, GETDATE()) 
union 
select SUM(GrossAmount)/3   
FROM Table
WHERE CreatedDate >= DATEADD(MONTH, -3, GETDATE())
)a

或者您可以使用条件聚合来查找您查询的值来自具有不同条件的同一张表

select ((sum(case when CreatedDate >= DATEADD(MONTH, -10, GETDATE()) then GrossAmount end)/10)
+(sum(case when CreatedDate >= DATEADD(MONTH, -6, GETDATE()) then GrossAmount end)/6)
+(sum(case when CreatedDate >= DATEADD(MONTH, -3, GETDATE()) then GrossAmount end)/3))/3 
from tablename

【讨论】:

    【解决方案2】:

    使用条件聚合。

    SELECT
    (
        SUM(CASE WHEN CreatedDate >= DATEADD(MONTH, -10, GETDATE()) THEN GrossAmount END) / 10 +
        SUM(CASE WHEN CreatedDate >= DATEADD(MONTH,  -6, GETDATE()) THEN GrossAmount END) /  6 +
        SUM(CASE WHEN CreatedDate >= DATEADD(MONTH,  -3, GETDATE()) THEN GrossAmount END) /  3
    ) / 3 AS [10, 6, 3 Average]
    FROM Table
    WHERE CreatedDate >= DATEADD(MONTH, -10, GETDATE()) -- this covers all three cases
    

    【讨论】:

    • 您可能希望else 0s 安全,以防没有旧数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多