在此处输入链接描述我想显示半年支出金额较大的费用类型 比每个半年平均费用类型支出 年四月至九月和十月至三月。 我已经做到了
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 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
您可以使用窗口函数
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