cross reference nearest date data

删除回忆录丶 提交于 2019-12-12 05:28:11

问题


I have three table ElecUser, ElecUsage, ElecEmissionFactor
ElecUser: UserID UserName 1 Main Building 2 Staff Quarter

ElecUsage: UserID Time Amount 1 1/7/2010 23230 1 8/10/2011 34340 1 8/1/2011 34300 1 2/3/2012 43430 1 4/2/2013 43560 1 3/2/2014 44540 2 3/6/2014 44000

ElecEmissionFactor: Time CO2Emission 1/1/2010 0.5 1/1/2011 0.55 1/1/2012 0.56 1/1/2013 0.57

And intended outcome:
UserName Time CO2 1 2010 11615 1 2011 37752 (34340*0.55 + 34300*0.55) 1 2012 24320.8 1 2013 24829.2 1 2014 25387.8 2 2014 25080

The logic is ElecUsage.Amount * ElecEmissionFactor. If same user and same year, add them up for the record of that year. My query is:
SELECT ElecUser.UserName, Year([ElecUsage].[Time]), SUM((ElecEmissionFactor.CO2Emission*ElecUsage.Amount)) As CO2 FROM ElecEmissionFactor, ElecUser INNER JOIN ElecUsage ON ElecUser.UserID = ElecUsage.UserID WHERE (((Year([ElecUsage].[Time]))>=Year([ElecEmissionFactor].[Time]))) GROUP BY ElecUser.UserName, Year([ElecUsage].[Time]) HAVING Year([ElecUsage].[Time]) = Max(Year(ElecEmissionFactor.Time));

However, this only shows the year with emission factor.
The challenge is to reference the year without emission factor to the latest year with emission factor.
Sub-query may be one of the solutions but i fail to do so.
I got stuck for a while. Hope to see your reply.
Thanks


回答1:


Try something like this..

-- not tested

select T1.id, year(T1.time) as Time, sum(T1.amount*T2.co2emission) as CO2 
from ElecUsage T1 
left outer join ElecEmissionFactor T2 on (year(T1.time) = year(T2.time))
Group by year(T1.time), T1.id

use sub query to get the corresponding factor in this way

    select T1.id, 
        year(T1.time) as Time, 
        sum(T1.amount*
                    (
                    select top 1 CO2Emission from ElecEmissionFactor T2 
                    where year(T2.time) <= year(T1.time) order by T2.time desc
                    )
        ) as CO2 
from ElecUsage T1 
Group by year(T1.time), T1.id


来源:https://stackoverflow.com/questions/31529235/cross-reference-nearest-date-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!