我正在使用maxofdate根据货币代码选择所有这些值。但是查询是空白的。
Select USDAMOUNT * dbo.EXCHANGERATEAMT
from dbo.Amount_monthly
Left Join dbo.EXCHANGERATE on dbo.Amount_monthly.Currencycode=dbo.EXCHANGERATE.fromcurrencycode
WHERE ValidToDateTime = (Select MAX(ValidToDateTime) from dbo.EXCHANGERATE)
AND dbo.EXCHANGERATE.EXCHANGERATETYPECODE = 'DAY'
使用此声明
CONVERT(DATE,ValidToDateTime) = CONVERT(DATE,GETDATE()-1)
而不是子查询给了我预期的结果。 有人可以纠正这个。 提前谢谢。
答案 0 :(得分:2)
如果我理解正确,你需要两件事。首先,public class ExampleViewModel: NotificationObject
{
public ICommand AddNewCommand { get; } = new Microsoft.Practices.Prism.Commands.DelegateCommand(AddNew, CanAdd); // method references arn't static??
public String NewName { get; set; } = "";
internal bool CanAdd()
{
//Can Add if string is non empty & non null
return !string.IsNullOrEmpty(NewName);
}
internal void AddNew()
{
var name = NewName ?? "NeedToCheckforNull";
var newWindSpeedEnv = new WindSpeedEnvelope()
{
Id = Guid.NewGuid(),
Name = name
};
}
}
的条件需要匹配外部查询中的条件。其次,如果你真的想要max()
,那么第二个表上的条件需要进入left join
子句。
生成的查询如下所示:
on
我会使用窗口函数来编写它,但这是一个单独的问题。
答案 1 :(得分:0)
尝试删除ValidToDateTime的WHERE子句,并将其作为AND条件包含在JOIN中
SELECT USDAMOUNT * dbo.EXCHANGERATEAMT
FROM dbo.Amount_monthly
LEFT JOIN dbo.EXCHANGERATE
ON dbo.Amount_monthly.Currencycode = dbo.EXCHANGERATE.fromcurrencycode
AND ValidToDateTime = (SELECT MAX(ValidToDateTime) --remove WHERE clause
FROM dbo.EXCHANGERATE)
AND dbo.EXCHANGERATE.EXCHANGERATETYPECODE = 'DAY';
答案 2 :(得分:0)
我稍微清理了你的查询:正如其他人提到你需要关闭MAX(Date)子查询周围的括号,如果在WHERE子句中引用LEFT JOINed表,它的行为就像一个INNER加入,所以我换了INNER。您还将“dbo”作为字段前缀填充,但该(名称空间)仅作为数据库的前缀,而不是字段。我添加了IS NOT NULL检查只是为了避免SQL给出“null值被消除”的SQL警告。我在第一个表中使用了别名“am”,在第二个表中使用了“er”,这使得它更具可读性:
SELECT am.USDAMOUNT * er.EXCHANGERATEAMT
FROM dbo.Amount_monthly am
JOIN dbo.EXCHANGERATE er
ON am.Currencycode = er.fromcurrencycode
WHERE er.ValidToDateTime = (SELECT MAX(ValidToDateTime) FROM dbo.EXCHANGERATE WHERE ValidToDateTime IS NOT NULL)
AND er.EXCHANGERATETYPECODE = 'DAY'
如果你像我一样偏执,你可能也想确保汇率不为零,以避免零除错误。