SQL Server中无公共列两表关联:查询笔记本的INR价格
SQL Server 查询解决方案
表结构与数据
USPricing表(仅存储美元计价价格)
字段:ProductId, ProductTitle, Currency, Market, UnitPrice
数据:
1, 'Laptop', 'USD', 'US', 500 2, 'Computer', 'USD', 'US', 300
ExchangeRate表(存储货币兑换汇率)
字段:CurrencyCode, USDPerUnit(表示1单位对应货币可兑换的美元数)
数据:
INR, 0.01208 EUR, 1.0541
查询需求
实现类似「查询笔记本的INR价格」的需求,预期输出:
Product, USD, INR Laptop, 500, 41666
查询语句
固定产品与货币的查询
SELECT up.ProductTitle AS Product, up.UnitPrice AS USD, ROUND(up.UnitPrice / er.USDPerUnit, 0) AS INR FROM USPricing up CROSS JOIN ExchangeRate er WHERE up.ProductTitle = 'Laptop' AND er.CurrencyCode = 'INR';
逻辑说明
- 两张表无公共关联列,使用
CROSS JOIN关联后,通过WHERE子句精准筛选目标产品与货币。 - 汇率计算:
USDPerUnit是1单位对应货币可兑换的美元数,因此美元转目标货币需用美元价格除以该汇率,ROUND函数用于取整得到整数结果。
参数化动态查询
如果需要灵活查询不同产品或货币,可使用参数化写法:
DECLARE @TargetProduct NVARCHAR(50) = 'Laptop'; DECLARE @TargetCurrency NVARCHAR(3) = 'INR'; SELECT up.ProductTitle AS Product, up.UnitPrice AS USD, ROUND(up.UnitPrice / er.USDPerUnit, 0) AS [TargetCurrency] FROM USPricing up CROSS JOIN ExchangeRate er WHERE up.ProductTitle = @TargetProduct AND er.CurrencyCode = @TargetCurrency;
动态列名查询(可选)
若要让结果列名自动匹配目标货币,可使用动态SQL:
DECLARE @TargetProduct NVARCHAR(50) = 'Laptop'; DECLARE @TargetCurrency NVARCHAR(3) = 'INR'; DECLARE @SQL NVARCHAR(MAX); SET @SQL = N' SELECT up.ProductTitle AS Product, up.UnitPrice AS USD, ROUND(up.UnitPrice / er.USDPerUnit, 0) AS ' + QUOTENAME(@TargetCurrency) + ' FROM USPricing up CROSS JOIN ExchangeRate er WHERE up.ProductTitle = @Product AND er.CurrencyCode = @Currency;'; EXEC sp_executesql @SQL, N'@Product NVARCHAR(50), @Currency NVARCHAR(3)', @Product = @TargetProduct, @Currency = @TargetCurrency;
内容的提问来源于stack exchange,提问作者Swasti
相关产品推荐
相关产品推荐

