2016-11-30 5 views
1

おはよう、SQL Server 2012(T-SQL)日単位の月単位の選択

毎日のデータを毎月のデータに集計しています。

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)) 

結果:それはHAVING句または選択リストに含まれるサブクエリでない限り集合体がWHERE句に表示されないことが 、列は、集約され外部参照です。

私はグループ内でagg-dayを使用してみましたが、どこを変更しても成功しませんでした。 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) 

お願いします。

+0

あなたはCTEにagg_day = MAX(agg_day)daily_data FROM SELECT closing_day_rateを入れていないのはなぜ - またはより良い:直接変数に結果を? – Tyron78

答えて

0

SOLUTION:

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 
;