找到大于平均金额的金额

问题描述 投票:0回答:2

在此处输入链接描述我想显示半年支出金额较大的费用类型 比每个半年平均费用类型支出 年四月至九月和十月至三月。 我已经做到了

select avgvalue>average//I want to show all expense type greater than average.
    from 
    (
        select sum(Amount) as avgvalue,avg(sum(Amount)) as average
        from mydatatable
        WHERE (DateofPayment like '%/04/%' OR  DateofPayment like '%/05/%' OR  DateofPayment like '%/06/%'
        OR  DateofPayment like '%/07/%' OR  DateofPayment like '%/08/%' OR  DateofPayment like '%/09/%') 
        group by ExpenseType
    )z

我找到了相同费用类型的平均金额和总和。但不知道该怎么做。请帮忙

我需要代码来获取四月至九月的所有费用类型。首先将所有相同的费用类型相加,以使费用类型唯一。然后取所有金额的平均值,然后显示金额大于平均值的所有费用类型

sql sql-server sql-server-2008
2个回答
0
投票

如果这是 SQL Server 2022,我建议使用

DATE_BUCKET()
函数将源日期干净地映射到 6 个月的buckets

对于早期版本的 SQL Server,您可以使用以下计算:

DATEADD(
    month,
    DATEDIFF(month, '1900-04-01', DateOfPayment ) / 6 * 6,
    '1900-04-01'
    ) AS DateBucket

这里,

'1900-04-01'
是用于定义任意6个月窗口(桶)开始的参考日期。
/ 6 * 6
用于将月份数字向下舍入为之前 6 个月的倍数。

然后可以将其包装在

CROSS APPLY
中,并在以后的
GROUP BY
或窗口函数
PARTITION BY
条件中使用。

生成的查询类似于:

select *
from (
    select *, AVG(SumAmount) OVER(PARTITION BY DateBucket) AS AvgSumAmount
    from 
    (
        select DateBucket, ExpenseType, sum(Amount) as SumAmount
        from mydatatable E
        cross apply (
            select dateadd(
                month, 
                datediff(month, '1900-04-01', DateOfPayment ) / 6 * 6,
                '1900-04-01'
                ) AS DateBucket
        ) b
        group by DateBucket, ExpenseType
    ) a
) a
where SumAmount >= AvgSumAmount

0
投票

您可以使用窗口函数

AVG(...) OVER ()
来平均表中的所有值。

SELECT
 *
FROM (
    SELECT
      ExpenseType,
      SUM(Amount) AS avgvalue,
      AVG(SUM(Amount)) OVER () AS average
    FROM mydatatable
    WHERE DATEPART(month, DateofPayment) BETWEEN 4 AND 9 
    GROUP BY ExpenseType
) z
WHERE avgvalue > average
© www.soinside.com 2019 - 2024. All rights reserved.