2017-07-04 41 views
0

我想对5月至6月之间的汇率变动进行区分,汇率以CZK(捷克克朗)借入的借款人总数与欧元相关。 例如:5月份,人们向我公司借入的金额为27M捷克克朗(相当于1M欧元),由于汇率变动,6月份仅为0.89M欧元。如何在货币汇率变动方面赚取差价

我来提供:

SELECT 
    SUM((
     SELECT Rate 
     FROM s96.CurrencyRates 
     WHERE (YEAR(Date)=2017) AND (MONTH(Date)=5) 
     ) * t.ApprovedLoanAmount) 
     - 
    SUM((
     SELECT Rate 
     FROM s96.CurrencyRates 
     WHERE (YEAR(Date)=2017) AND (MONTH(Date)=6) 
     ) * t.ApprovedLoanAmount) 
    AS currChange 
FROM(
     SELECT ApprovedLoanAmount 
     FROM dim.Contract con 
      JOIN dim.Calendar cal ON con.CreateDateID = cal.DateId 
     WHERE (cal.CalendarYear = 2017) AND (cal.MonthOfYear = 5) 
    ) t 

它返回:

不能对包含聚合或子查询的表达式执行聚合功能。

任何帮助将被折扣。

+1

con.CreateDateID的列类型是什么? (我怀疑“int”)你为什么期望能够将它投射到一个日期? –

+0

是的,它是int。我希望能够设置所需的日期。也许,我应该使用LEFT? –

+0

我猜你不想要那个CreatedDateID列,但一些“CreatedDate”值(或该表中的其他列)*是日期类型的*。或者你是否将日期编码为该值(int 20170704而不是日期2017-07-04)? –

回答

1

有几个选项可以更改您的查询。 您可以计算子查询中的当前费率,并在1 = 1时使用左连接。 你也可以改变你的总和语句:

SELECT 
((
     SELECT SUM(Rate) 
     FROM s96.CurrencyRates 
     WHERE (YEAR(Date)=2017) AND (MONTH(Date)=5) 
     ) * t.ApprovedLoanAmount) 
    - 
    ((
     SELECT SUM(Rate) 
     FROM s96.CurrencyRates 
     WHERE (YEAR(Date)=2017) AND (MONTH(Date)=6) 
     ) * t.ApprovedLoanAmount) 
    AS currChange 
FROM(
     SELECT ApprovedLoanAmount 
     FROM dim.Contract con 
      JOIN dim.Calendar cal ON con.CreateDateID = cal.DateId 
     WHERE (cal.CalendarYear = 2017) AND (cal.MonthOfYear = 5) 
    ) t 
2

我不知道你的确切表怎么看,所以觉得这更像是一个比片段复制/粘贴的解决方案:

SELECT 
    SUM(ApprovedLoanAmount) AS ApprovedLoanAmountCZK 
, SUM(ApprovedLoanAmountEUR_May) AS ApprovedLoanAmountEUR_May 
, SUM(ApprovedLoanAmountEUR_June) AS ApprovedLoanAmountEUR_June 
, SUM(ApprovedLoanAmountEUR_May) - SUM(ApprovedLoanAmountEUR_June) AS CurrChange 
FROM 
(
    SELECT ApprovedLoanAmount 
    , ApprovedLoanAmount * (SELECT Rate 
          FROM s96.CurrencyRates rM 
          WHERE rM.Date = cal.Date -- date of contract? 
          AND rM.Currency = 'EUR' -- if you have other currencies rates in same table 
    ) AS ApprovedLoanAmountEUR_May 
    , ApprovedLoanAmount * (SELECT Rate 
         FROM s96.CurrencyRates rJ 
         WHERE rJ.Date = '20170630' 
         AND rJ.Currency = 'EUR' 
    ) AS ApprovedLoanAmountEUR_June 
    FROM dim.Contract con 
    JOIN dim.Calendar cal ON con.CreateDateID = cal.DateId 
    WHERE (cal.CalendarYear = 2017) AND (cal.MonthOfYear = 5) 
) t 
  • 确保两个子查询率只返回一行每个
  • 更换cal.Date和rM.Currency与您的具体列
  • 替换cal.Date与“20170531”,如果你想在速度5月底替代合同日期
+0

CurrencyRates格式日期为2016-12-30,但我不知道如何将日期与日期进行比较。例如。如果我写“rj.Currency = 2017-06-30”,它会返回一个错误,因为它无法与int进行比较。 此外,cal.Date是int ... –

+0

就像我说的,我不知道你的表的结构。你必须自己调整查询。如果您遇到问题,请更新您的问题,以提供所有相关表格的结构和样本数据(CurrencyRate,Contract,Calendar) –

相关问题