Sql server SQL Server 2012(T-SQL)按组选择日到月

Sql server SQL Server 2012(T-SQL)按组选择日到月,sql-server,date,aggregate-functions,Sql Server,Date,Aggregate Functions,你好 我将每日数据汇总为每月数据 TABLE daily_data: item_from, item_to, agg_day, average_day_rate, min_day_rate, max_day_rate, closing_day_rate TABLE monthly_data: item_from, item_to, agg_month, average_month_rate, min_month_rate, max_month_rate, closing_month_rate

你好

我将每日数据汇总为每月数据

TABLE daily_data:
item_from,
item_to,
agg_day,
average_day_rate,
min_day_rate,
max_day_rate,
closing_day_rate

TABLE monthly_data:
item_from,
item_to,
agg_month,
average_month_rate,
min_month_rate,
max_month_rate,
closing_month_rate
选择数据:

DECLARE @rundate       DATE;
DECLARE @yesterday     DATE;
DECLARE @firstofmonth  DATE;

SET @runday        = CONVERT(DATE, GETDATE())
SET @yesterday     = CONVERT(DATE, DATEADD(dd,-1,GETDATE()))
SET @firstofmonth  = DATEADD(dd, 1, EOMONTH(@yesterday, -1))

SELECT
  item_from,
  item_to,
  DATEADD(dd, 1, EOMONTH(agg_day, -1))                                     agg_month,
  SUM(average_day_rate)/COUNT(DISTINCT(agg_day))                          average_month_rate,
  MIN(min_day_rate)                                                       min_month_rate,
  MAX(max_day_rate)                                                       max_month_rate,
  (SELECT closing_day_rate FROM daily_data WHERE agg_day = MAX(agg_day))  closing_month_rate
FROM
  daily_data
WHERE
  agg_day >= @firstofmonth
  and agg_day < @runday
GROUP BY
  item_from,
  item_to,
  DATEADD(dd, 1, EOMONTH(agg_day, -1))
结果: 聚合不能出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中,并且被聚合的列是外部引用

我试着在小组中使用aggday,将where改为having,但没有成功。 在PL-SQL中,我将使用

SELECT
  item_from,
  item_to,
  trunc(agg_day, MONTH)                                                  agg_month,
  SUM(average_day_rate)/COUNT(DISTINCT(agg_day))                          average_month_rate,
  MIN(min_day_rate)                                                       min_month_rate,
  MAX(max_day_rate)                                                       max_month_rate,
  (SELECT closing_day_rate FROM daily_data WHERE agg_day = MAX(agg_day))  closing_month_rate
FROM
  daily_data
WHERE
  agg_day >= @firstofmonth
  and agg_day < @runday
GROUP BY
  item_from,
  item_to,
  trunc(agg_day, MONTH)
请提供帮助。

解决方案:

DECLARE @rundate        DATE;
DECLARE @yesterday      DATE;
DECLARE @firstofmonth   DATE;
DECLARE @lastdayclosing SMALLMONEY;

SET @runday        = CONVERT(DATE, GETDATE())
SET @yesterday     = CONVERT(DATE, DATEADD(dd,-1,GETDATE()))
SET @firstofmonth  = DATEADD(dd, 1, EOMONTH(@yesterday, -1))
SET @lastdayclosing = (SELECT close_rate FROM exchange_rate_daily WHERE exr_date = @yesterday)

SELECT
  item_from,
  item_to,
  @firstofmonth                                   agg_month,
  SUM(average_day_rate)/COUNT(DISTINCT(agg_day))  average_month_rate,
  MIN(min_day_rate)                               min_month_rate,
  MAX(max_day_rate)                               max_month_rate,
  @lstdayclosing                                  closing_month_rate
FROM
  daily_data
WHERE
  agg_day >= @firstofmonth
  and agg_day < @runday
GROUP BY
  item_from,
  item_to
;
解决方案:

DECLARE @rundate        DATE;
DECLARE @yesterday      DATE;
DECLARE @firstofmonth   DATE;
DECLARE @lastdayclosing SMALLMONEY;

SET @runday        = CONVERT(DATE, GETDATE())
SET @yesterday     = CONVERT(DATE, DATEADD(dd,-1,GETDATE()))
SET @firstofmonth  = DATEADD(dd, 1, EOMONTH(@yesterday, -1))
SET @lastdayclosing = (SELECT close_rate FROM exchange_rate_daily WHERE exr_date = @yesterday)

SELECT
  item_from,
  item_to,
  @firstofmonth                                   agg_month,
  SUM(average_day_rate)/COUNT(DISTINCT(agg_day))  average_month_rate,
  MIN(min_day_rate)                               min_month_rate,
  MAX(max_day_rate)                               max_month_rate,
  @lstdayclosing                                  closing_month_rate
FROM
  daily_data
WHERE
  agg_day >= @firstofmonth
  and agg_day < @runday
GROUP BY
  item_from,
  item_to
;

为什么不将agg_day=MAXagg_day的每日数据中的选择收盘日利率放入cte?或者更好:将结果直接放入变量?为什么不将agg_day=MAXagg_day的每日数据中的选择收盘日利率放入cte?或者更好:将结果直接放入变量?