SQL Server中两表按月份匹配实现值相乘的方法求助
解决临时表按月份匹配相乘的问题
我来帮你排查下问题所在,你之前的SQL逻辑明显搞反了关联条件,所以没得到预期结果。
问题分析
你要实现的是当#Temp1和#Temp2的月份相同时,将对应行的costs和ratio相乘,但原语句里的WHERE #Temp2.ratio = CAST(SUBSTRING(#Temp1.date,5,2)AS INT)是把ratio的值和月份数字做相等判断,这完全不是你要的“月份匹配”逻辑——相当于你在找ratio值等于月份的行,而不是找月份相同的行来关联。
正确的SQL写法
首先假设两个临时表的结构(根据你的需求推测):
#Temp1:包含costs(数值类型)、date(字符串/日期类型,格式为YYYYMMDD)#Temp2:包含month(整数类型,比如1代表1月)、ratio(数值类型,对应月份的比例值)
用INNER JOIN来清晰关联两个表的月份,再计算乘积:
SELECT t1.costs, t1.date, t1.costs * t2.ratio AS Value -- 这里的Value就是你要的相乘结果,你期望结果里的"ratio"应该是笔误 FROM #Temp1 t1 INNER JOIN #Temp2 t2 ON CAST(SUBSTRING(t1.date, 5, 2) AS INT) = t2.month;
如果#Temp2里没有单独的month字段,而是用date字段(同样是YYYYMMDD格式)存储月份信息,那调整关联条件即可:
SELECT t1.costs, t1.date, t1.costs * t2.ratio AS Value FROM #Temp1 t1 INNER JOIN #Temp2 t2 ON CAST(SUBSTRING(t1.date, 5, 2) AS INT) = CAST(SUBSTRING(t2.date, 5, 2) AS INT);
为什么这样写能解决问题
- 用
INNER JOIN代替老式的逗号连接表,逻辑更清晰,能避免意外的笛卡尔积(全表交叉连接) - 关联条件精准匹配了两个表的月份值,确保只有月份相同的行才会被关联
- 直接在SELECT里计算
costs * ratio,得到你需要的乘积结果
按照这个写法,就能得到你期望的结果格式啦。
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

