我已经四处寻找解决方案,但至少我找不到至少与我的案子相似的任何东西。
我需要根据购买产品的日期选择汇率。让我尝试解释。
我有一张带有货币的表:
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;
具有汇率的表:
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;
和一张带有产品的表(请注意,我的产品在表中列出,在我的情况下是可以的):
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;
在汇率表中,以这样的为例:
设置值: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
等等...
我想根据购买产品及其购买的货币来选择一个唯一的汇率。
换句话说,例如,如果我有一个在2018年7月2日购买的产品,则该查询必须选择与购买日期及其货币相匹配的相关日期愤怒中有效的汇率。在此示例中,在2018年7月2日购买的产品的正确交换愤怒为1.918
请注意,汇率是在随机日期设置的(按照上面的示例)。
我设法进行了此查询,但这并不确切,因为有时会返回两个或更多结果(由于我设置了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)
对于相当简单的解决方案,您可以做
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
另一个选项,如果您对模式有控制权,则将您的汇率表更改为"日期"one_answers"数据",而不仅仅是日期,则意味着您可以简单地使用关键字之间的正确汇率找到正确的汇率。
我是初学者,因此不能保证正确。我相信您必须与SQL一起使用某种应用程序编程语言,例如PHP。尽管如此,我仍将概述要采取的基本步骤。
1。使用简单的选择语句将购买货币ID和购买日期分配给变量。假设我将ID提供给 targetID ,并将其日期为 targetDate 。
2。从tblexchrates中选择最小(日期),其中date&lt; = targetDate 和currkey = targetId ;//选择最新日期,其范围包括匹配货币ID之间的购买日期。将此语句的结果分配给另一个变量。假设我使用了变量 DEDATERANGE 。
3。从tblexchrates中选择Exchange,其中日期= targetDate ;//找到所选日期的汇率。
请注意,有很多方法可以做到这一点。例如,您可以使用表加入(请参阅此链接:https://www.w3schools.com/sql/sql_join.asp)或仅在一个SQL语句中从其他表中选择列(请参阅此堆栈溢出问题:mysql:mysql从一个表中选择所有列,而从另一表中选择一些列)。最后,您可以使用SQL创建变量(请参阅此问题:从查询中设置变量结果),然后执行操作。