Select 基于货币和日期的汇率
Select Exchange Rate based on Currency and Date
我四处寻找解决方案,但至少我找不到任何至少与我的情况相似的东西。
我需要select汇率,基于购买产品的日期。
让我试着解释一下。
我有一个 table 货币:
CREATE TABLE `tblCurrencies` (
`CurrID` int(11) NOT NULL AUTO_INCREMENT,
`CurencySymbol` varchar(1) DEFAULT NULL,
`CurrencyCode` varchar(3) DEFAULT NULL,
`CurrencyDescription` varchar(100) DEFAULT NULL,
PRIMARY KEY (`CurrID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
A table 汇率:
CREATE TABLE `tblExchRates` (
`ExcID` int(11) NOT NULL AUTO_INCREMENT,
`CurrKey` int(11) DEFAULT NULL,
`Date` date DEFAULT NULL,
`Exchange` decimal(11,3) DEFAULT NULL,
PRIMARY KEY (`ExcID`),
KEY `CurrKey` (`CurrKey`),
CONSTRAINT `tblExchRates_ibfk_1` FOREIGN KEY (`CurrKey`) REFERENCES `tblCurrencies` (`CurrID`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8;
还有一个带有产品的 table(请注意,我的产品在 table 中以数字形式列出,这对我来说没问题):
CREATE TABLE `tblProducts` (
`ProductID` int(11) NOT NULL AUTO_INCREMENT,
`Contract` int(11) DEFAULT NULL,
`Product` int(11) DEFAULT NULL,
`Type` varchar(100) DEFAULT NULL,
`Currency` int(11) DEFAULT NULL,
`Amount` decimal(10,0) DEFAULT NULL,
`PurchaseDate` datetime DEFAULT NULL,
PRIMARY KEY (`ProductID`),
KEY `Contract` (`Contract`),
KEY `Currency` (`Currency`),
CONSTRAINT `tblShopCart_ibfk_2` FOREIGN KEY (`Currency`) REFERENCES `tblCurrencies` (`CurrID`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `tblShopCart_ibfk_1` FOREIGN KEY (`Contract`) REFERENCES `tblContracts` (`ContractID`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3155 DEFAULT CHARSET=utf8;
在汇率 table 中,例如,值设置如下:
CurrKey Date Exchange
1 15-01-2017 0.850
1 31-01-2017 0.856
1 02-02-2018 0.918
1 18-02-2018 0.905
2 04-02-2018 1.765
2 14-02-2018 1.755
等等...
我想查询 select 基于产品购买日期和购买货币的唯一汇率。
换句话说,例如,如果我的产品是在 07-02-2018 购买的,则查询必须 select 在匹配的相关日期范围内有效的汇率购买日期及其货币。在此示例中,对于 2018 年 7 月 2 日购买的 currkey 为 1 的产品,正确的汇率为 0.918
请注意,汇率是随机设置的(如上例所示)。
我设法进行了此查询,但它并不精确,因为它有时会 returns 两个或更多结果(由于我设置的 10 天范围),而我只需要 1 个结果:
SELECT
tblExchRates.Exchange
FROM
tblCurrencies
INNER JOIN tblExchRates ON tblExchRates.CurrKey = tblCurrencies.CurrID
WHERE
tblCurrencies.CurrencyCode = "EUR" AND
tblExchRates.Date BETWEEN (tblProducts.PurchaseDate - INTERVAL 10 DAY) AND (tblProducts.PurchaseDate + INTERVAL 10 DAY)
我自己是初学者,所以不能保证正确性。我相信您必须使用某种应用程序编程语言以及 SQL,例如 PHP。不过,我将概述我将采取的基本步骤。
1。使用简单的 SELECT 语句将购买货币 ID 和购买日期分配给变量。假设我将 ID 提供给 targetID,并将日期提供给 targetDate。
2。 SELECT MIN(Date) FROM tblExchRates WHERE Date <= targetDate AND CurrKey =targetID; //Select最近日期,其范围包括匹配货币ID中的购买日期。将此语句的结果分配给另一个变量。假设我使用了变量 dateRange。
3。 SELECT Exchange FROM tblExchRates WHERE Date = targetDate; //查找所选日期的汇率。
请注意,有很多方法可以做到这一点。例如,您可以使用 table JOINS(参考这个 link: https://www.w3schools.com/sql/sql_join.asp ) or select columns from different tables in just one SQL statement (refer to this Stack overflow question: MySQL Select all columns from one table and some from another table). Last, you can use SQL to create variables (refer to this question: Set the variable result, from query)然后执行操作。
对于一个相当简单的解决方案,你可以做到
SELECT
p.*
,(SELECT TOP 1 er.Exchange
FROM tblExchRates AS er
INNER JOIN tblCurrencies AS c ON er.CurrKey = c.CurrID AND c.CurrencyCode = 'EUR'
WHERE er.Date <= p.PurchaseDate
ORDER BY er.Date DESC) AS ExchangeRate
FROM
tblProducts AS p
另一种选择,如果您可以控制架构,然后更改汇率 table 以具有 DateFrom 和 DateTo 而不仅仅是日期,则意味着您可以使用 BETWEEN 简单地找到正确的汇率关键字。
我四处寻找解决方案,但至少我找不到任何至少与我的情况相似的东西。
我需要select汇率,基于购买产品的日期。 让我试着解释一下。
我有一个 table 货币:
CREATE TABLE `tblCurrencies` (
`CurrID` int(11) NOT NULL AUTO_INCREMENT,
`CurencySymbol` varchar(1) DEFAULT NULL,
`CurrencyCode` varchar(3) DEFAULT NULL,
`CurrencyDescription` varchar(100) DEFAULT NULL,
PRIMARY KEY (`CurrID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
A table 汇率:
CREATE TABLE `tblExchRates` (
`ExcID` int(11) NOT NULL AUTO_INCREMENT,
`CurrKey` int(11) DEFAULT NULL,
`Date` date DEFAULT NULL,
`Exchange` decimal(11,3) DEFAULT NULL,
PRIMARY KEY (`ExcID`),
KEY `CurrKey` (`CurrKey`),
CONSTRAINT `tblExchRates_ibfk_1` FOREIGN KEY (`CurrKey`) REFERENCES `tblCurrencies` (`CurrID`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8;
还有一个带有产品的 table(请注意,我的产品在 table 中以数字形式列出,这对我来说没问题):
CREATE TABLE `tblProducts` (
`ProductID` int(11) NOT NULL AUTO_INCREMENT,
`Contract` int(11) DEFAULT NULL,
`Product` int(11) DEFAULT NULL,
`Type` varchar(100) DEFAULT NULL,
`Currency` int(11) DEFAULT NULL,
`Amount` decimal(10,0) DEFAULT NULL,
`PurchaseDate` datetime DEFAULT NULL,
PRIMARY KEY (`ProductID`),
KEY `Contract` (`Contract`),
KEY `Currency` (`Currency`),
CONSTRAINT `tblShopCart_ibfk_2` FOREIGN KEY (`Currency`) REFERENCES `tblCurrencies` (`CurrID`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `tblShopCart_ibfk_1` FOREIGN KEY (`Contract`) REFERENCES `tblContracts` (`ContractID`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3155 DEFAULT CHARSET=utf8;
在汇率 table 中,例如,值设置如下:
CurrKey Date Exchange
1 15-01-2017 0.850
1 31-01-2017 0.856
1 02-02-2018 0.918
1 18-02-2018 0.905
2 04-02-2018 1.765
2 14-02-2018 1.755
等等...
我想查询 select 基于产品购买日期和购买货币的唯一汇率。
换句话说,例如,如果我的产品是在 07-02-2018 购买的,则查询必须 select 在匹配的相关日期范围内有效的汇率购买日期及其货币。在此示例中,对于 2018 年 7 月 2 日购买的 currkey 为 1 的产品,正确的汇率为 0.918
请注意,汇率是随机设置的(如上例所示)。
我设法进行了此查询,但它并不精确,因为它有时会 returns 两个或更多结果(由于我设置的 10 天范围),而我只需要 1 个结果:
SELECT
tblExchRates.Exchange
FROM
tblCurrencies
INNER JOIN tblExchRates ON tblExchRates.CurrKey = tblCurrencies.CurrID
WHERE
tblCurrencies.CurrencyCode = "EUR" AND
tblExchRates.Date BETWEEN (tblProducts.PurchaseDate - INTERVAL 10 DAY) AND (tblProducts.PurchaseDate + INTERVAL 10 DAY)
我自己是初学者,所以不能保证正确性。我相信您必须使用某种应用程序编程语言以及 SQL,例如 PHP。不过,我将概述我将采取的基本步骤。
1。使用简单的 SELECT 语句将购买货币 ID 和购买日期分配给变量。假设我将 ID 提供给 targetID,并将日期提供给 targetDate。
2。 SELECT MIN(Date) FROM tblExchRates WHERE Date <= targetDate AND CurrKey =targetID; //Select最近日期,其范围包括匹配货币ID中的购买日期。将此语句的结果分配给另一个变量。假设我使用了变量 dateRange。
3。 SELECT Exchange FROM tblExchRates WHERE Date = targetDate; //查找所选日期的汇率。
请注意,有很多方法可以做到这一点。例如,您可以使用 table JOINS(参考这个 link: https://www.w3schools.com/sql/sql_join.asp ) or select columns from different tables in just one SQL statement (refer to this Stack overflow question: MySQL Select all columns from one table and some from another table). Last, you can use SQL to create variables (refer to this question: Set the variable result, from query)然后执行操作。
对于一个相当简单的解决方案,你可以做到
SELECT
p.*
,(SELECT TOP 1 er.Exchange
FROM tblExchRates AS er
INNER JOIN tblCurrencies AS c ON er.CurrKey = c.CurrID AND c.CurrencyCode = 'EUR'
WHERE er.Date <= p.PurchaseDate
ORDER BY er.Date DESC) AS ExchangeRate
FROM
tblProducts AS p
另一种选择,如果您可以控制架构,然后更改汇率 table 以具有 DateFrom 和 DateTo 而不仅仅是日期,则意味着您可以使用 BETWEEN 简单地找到正确的汇率关键字。