有懂SQL的兄弟进来帮我看一看,怎么解决这个问题。
现在有两个表:表1和表2都有一个字段叫No,也就是编号。在表1中,A3的值根据A2的值按每两个字符为一组分割,分组的交数由A1决定,再相加缩小10倍,例如:第一条记录:A...
现在有两个表:表1和表2都有一个字段叫No,也就是编号。
在表1中,A3的值根据A2的值按每两个字符为一组分割,分组的交数由A1决定,再相加缩小10倍,例如:
第一条记录:A1为2,则把A2分两组,10,10,再分别除以10相加得(10+10)/10=2,也就是A3为2
第二条记录:A1为3,则把A2分三组,12,13,14,得(12+13+14)/10=3.9,也就是A3为3.9
第三条记录:A1为3,则把A2分为20,20,20,得(20+20+20)/10=6,也就是A3为6
同理,第四条记录,A3=(30+20+20+20)=9
但是,A1记录有时会与事实不符,需要用到表2的数据来校对,具体是这样的:
表2中与表1中No字段相同的记录的B1字段的最大数为表1中的字段A1的数:
例如:表2中No字段为2的有两条记录,其B1字段分别为1,2,则表1中字段A1为2
表2中字段No为3的有三条记录,其B1字段分别为1,2,3,则表1中字段A1为3
如果表2中没有表1中字段No相应的记录,表1中的A1字段应该是0,A3也应该是0
例如,表1中有一条记录No=6,A1=3,A2=252524,A3=7.4
那么校对之后的的数据应该是:No=6,A1=0,A2=252524,A3=0
如何实现?? 展开
在表1中,A3的值根据A2的值按每两个字符为一组分割,分组的交数由A1决定,再相加缩小10倍,例如:
第一条记录:A1为2,则把A2分两组,10,10,再分别除以10相加得(10+10)/10=2,也就是A3为2
第二条记录:A1为3,则把A2分三组,12,13,14,得(12+13+14)/10=3.9,也就是A3为3.9
第三条记录:A1为3,则把A2分为20,20,20,得(20+20+20)/10=6,也就是A3为6
同理,第四条记录,A3=(30+20+20+20)=9
但是,A1记录有时会与事实不符,需要用到表2的数据来校对,具体是这样的:
表2中与表1中No字段相同的记录的B1字段的最大数为表1中的字段A1的数:
例如:表2中No字段为2的有两条记录,其B1字段分别为1,2,则表1中字段A1为2
表2中字段No为3的有三条记录,其B1字段分别为1,2,3,则表1中字段A1为3
如果表2中没有表1中字段No相应的记录,表1中的A1字段应该是0,A3也应该是0
例如,表1中有一条记录No=6,A1=3,A2=252524,A3=7.4
那么校对之后的的数据应该是:No=6,A1=0,A2=252524,A3=0
如何实现?? 展开
1个回答
展开全部
WITH tb1 AS (
SELECT 2 AS No,2 AS A1,1010 AS A2,2 AS A3
UNION
SELECT 3,3,121314,3.9
UNION
SELECT 4,3,2020,6
UNION
SELECT 5,4,30202020,9
UNION
SELECT 6,3,252524,7.4
),
tb2 AS (
SELECT 2 AS No,1 AS B1,'' AS B2
UNION
SELECT 2,2,''
UNION
SELECT 3,1,''
UNION
SELECT 3,2,''
UNION
SELECT 3,3,''
UNION
SELECT 4,1,''
UNION
SELECT 4,2,''
UNION
SELECT 4,3,''
UNION
SELECT 5,1,''
UNION
SELECT 5,2,''
UNION
SELECT 5,3,''
UNION
SELECT 5,4,''
)
--以上为创建测试表
SELECT tb1.No,SUM(CASE WHEN tb2.No IS NULL THEN 0 ELSE 1 END),tb1.A2,CASE WHEN tb2.No IS NULL THEN 0 ELSE tb1.A3 END
FROM tb1 LEFT JOIN tb2
ON tb1.NO = tb2.NO
GROUP BY tb1.No,tb1.A2,CASE WHEN tb2.No IS NULL THEN 0 ELSE tb1.A3 END
或者
SELECT tb1.No,COUNT(tb2.No),tb1.A2,tb1.A3*COUNT(tb2.No)/COUNT(tb1.No)
FROM tb1 LEFT JOIN tb2
ON tb1.NO = tb2.NO
GROUP BY tb1.No,tb1.A2,tb1.A3
追问
你的思路很好,我怎么就没想到用多表连接呢?
不过,不管是sum或count得到的都是行数,不是最大数。
我要求的是得到表2中对应表1中NO字段的最大值,不是总数。
难道只能用游标一条一条的操作吗?
追答
count结果和最大值会有区别吗?除非你中间数值有中断或者不从1开始,比如1、2、4,或者2、3、4这种。
如果需要最大值,可以把count改成max
SELECT tb1.No,ISNULL(MAX(tb2.B1),0),tb1.A2,tb1.A3*COUNT(tb2.No)/COUNT(tb1.No)
FROM tb1 LEFT JOIN tb2
ON tb1.NO = tb2.NO
GROUP BY tb1.No,tb1.A2,tb1.A3
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询