实在不知道该怎么写这个sql语句了,关于两表中的字段相加存入第3表中的某字段中

YangYun 2018-02-12 11:03:45
我有三个表tbA,tbB,tbC
其中tbA( idA,Num)
tbB(idB,idA,bValue)
tbC(idC,idA,cValue)

我想同时向tbA表执行更新动作,期望同时更新tbA.Num=tbB.bValue+sum(tbC.cValue)


我的sql语言太差,实在搞不出来呀,无奈只好求助网上各位大神了

祝大家新年快乐,狗年都走“狗屎运”
...全文
1279 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
YangYun 2018-02-18
  • 打赏
  • 举报
回复
sql果然博大精深,感谢各位的的关注,虽然我诊然没找到为啥结果是131而不是151,少了的这20到哪儿去了。
nettman 2018-02-14
  • 打赏
  • 举报
回复
关注,学习
nettman 2018-02-13
  • 打赏
  • 举报
回复
关注,学习
zjcxc 2018-02-13
  • 打赏
  • 举报
回复
最后说下细节和性能 CONVERT (VARCHAR (10), fdate, 120) = CONVERT (VARCHAR (10), @NCDate) 这两个并不能保证结果相同,第2个没有加日期样式 120 从性能上讲, 这几种用法通常会导无法使用索引 CONVERT (VARCHAR (10), fdate, 120) = CONVERT (VARCHAR (10), @NCDate) -- 建议改为 fdate >= CONVERT (VARCHAR (10), @NCDate,120) and fdate < dateadd(day, 1, CONVERT (VARCHAR (10), @NCDate,120)) AND CONVERT (VARCHAR (10), p.fDate, 120) > CONVERT (VARCHAR (10), @YCDate, 120) -- 建议改为 p.fDate >= dateadd(day, 1, CONVERT (VARCHAR (10), @YCDate, 120)) AND CONVERT (VARCHAR (10), p.fDate, 120) <= CONVERT (VARCHAR (10), @ViewDate, 120) -- 建议改为 p.fDate < dateadd(day, 1, CONVERT (VARCHAR (10), @ViewDate, 120))
zjcxc 2018-02-13
  • 打赏
  • 举报
回复
UPDATE A
-- 任意一个值为 NULL,则整个结果为 NULL, 如果要避免,则使用 ISNULL 做处理
SET InStoreNum = ISNULL(B.StoreNum,0) + ISNULL(C.inNum,0) - ISNULL(D.OutNum,0)
FROM #tb AS A
	-- 你原来的匹配关系,要求 GoodsID 在所有表中都有才更新,如果任何一个表中存在都更新,则入用 LEFT JOIN
	LEFT JOIN (
		SELECT goodsID,
                StoreNum
        FROM T_CheckStore
        WHERE CONVERT (VARCHAR (10), fdate, 120) = CONVERT (VARCHAR (10), @NCDate)
                AND DepID = @DepID
                AND iFlag = 0
	) AS B ON A.GoodsID = b.GoodsID
	LEFT JOIN (
		SELECT p.GoodsID,
                SUM(p.num) AS inNum
        FROM Log_Store AS p
        WHERE p.iFlag = 0
                AND p.depID = @depID
                AND CONVERT (VARCHAR (10), p.fDate, 120) > CONVERT (VARCHAR (10), @YCDate, 120)
                AND CONVERT (VARCHAR (10), p.fDate, 120) <= CONVERT (VARCHAR (10), @ViewDate, 120)
        GROUP BY p.GoodsID
	) AS C ON a.GoodsID = c.GoodsID
	LEFT JOIN (
		SELECT q.goodsid,
                sum(q.num) AS OutNum
        FROM log_Store AS q
        WHERE (q.iflag = 1
                AND q.depid = @DepID
                AND CONVERT (VARCHAR (10), q.fdate, 120) > CONVERT (VARCHAR (10), @YCDate, 120)
                AND CONVERT (VARCHAR (10), q.fdate, 120) <= CONVERT (VARCHAR (10), @ViewDate, 120))
        GROUP BY q.goodsid
	) AS D on a.GoodsID = d.GoodsID
YangYun 2018-02-13
  • 打赏
  • 举报
回复
我分步试了一下各个子查询,都可以得到需要的结果,但结果就为null了,奇怪呀,问题出在哪儿呢
YangYun 2018-02-13
  • 打赏
  • 举报
回复
引用 12 楼 zjcxc 的回复:
D 这个子查询应该是用 q.goodsid 吧?
还是你眼神好使,我的D查询中,确实把q写成了p,改掉了就没报错了,但不过遗憾的是,结果是null,这结果是不对的 难道 最后不能用where A.GoodsID=b.GoodsID and a.GoodsID=c.GoodsID and a.GoodsID=d.GoodsID来判断???
zjcxc 2018-02-13
  • 打赏
  • 举报
回复
D 这个子查询应该是用 q.goodsid 吧?
zjcxc 2018-02-13
  • 打赏
  • 举报
回复
(Select p.goodsid,sum(q.num) as OutNum from log_Store q where (q.iflag=1 and q.depid=@DepID and convert(varchar(10),q.fdate,120)>convert(varchar(10),@YCDate,120) and convert(varchar(10),q.fdate,120)<=convert(varchar(10),@ViewDate,120)) group by q.goodsid) D
YangYun 2018-02-13
  • 打赏
  • 举报
回复
下面是我参照 4楼方法在存储过程中写的一段sql Update A set InStoreNum=B.StoreNum+C.inNum-D.OutNum from #tb A,(Select goodsID,StoreNum from T_CheckStore Where CONVERT(varchar(10),fdate,120)=CONVERT(varchar(10),@NCDate) and DepID=@DepID and iFlag=0 ) B, (Select p.GoodsID, SUM(p.num) as inNum from Log_Store p Where p.iFlag=0 and p.depID=@depID and convert(varchar(10),p.fDate,120)>convert(varchar(10),@YCDate,120) and convert(varchar(10),p.fDate,120)<=convert(varchar(10),@ViewDate,120) group by p.GoodsID) C, (Select p.goodsid,sum(q.num) as OutNum from log_Store q where (q.iflag=1 and q.depid=@DepID and convert(varchar(10),q.fdate,120)>convert(varchar(10),@YCDate,120) and convert(varchar(10),q.fdate,120)<=convert(varchar(10),@ViewDate,120)) group by q.goodsid) D where A.GoodsID=b.GoodsID and a.GoodsID=c.GoodsID and a.GoodsID=d.GoodsID 存储过程编译没问题,但在调试运行过程中,出现了这样的提示:无法绑定由多个部分组成的标识符 "p.goodsid"。 (Select p.GoodsID, SUM(p.num) as inNum from Log_Store p Where p.iFlag=0 and p.depID=@depID and convert(varchar(10),p.fDate,120)>convert(varchar(10),@YCDate,120) and convert(varchar(10),p.fDate,120)<=convert(varchar(10),@ViewDate,120) group by p.GoodsID) C, 只有上面才出现了 p,但这 一段有问题吗?看不出来呀
wjl443864075 2018-02-13
  • 打赏
  • 举报
回复
感谢分享!!!!
  • 打赏
  • 举报
回复
估计是你的某个关联因为数据缺失而没有结果。 逐步简化你的问题, 一步步找。 另外, 你的sql语句有些没法看了, 性能上也不可能高, 后面的维护是个大问题。
YangYun 2018-02-13
  • 打赏
  • 举报
回复
下面是我写的Sql语句,虽然没报错,可是什么结果也没返回 Update A set InStoreNum=((Select StoreNum from T_CheckStore Where CONVERT(varchar(10),fdate,120)=CONVERT(varchar(10),@NCDate) and DepID=@DepID and iFlag=0 and GoodsID=A.GoodsID)+( Select SUM(p.num)-SUM(q.num) from Log_Store p,Log_Store q Where (p.iFlag=0 and p.depID=A.depID and p.GoodsID=A.goodsid and convert(varchar(10),p.fDate,120)>convert(varchar(10),@YCDate,120) and convert(varchar(10),p.fDate,120)<=convert(varchar(10),@ViewDate,120)) and (q.iflag=1 and q.depid=A.depid and q.goodsid=a.goodsid and convert(varchar(10),q.fdate,120)>convert(varchar(10),@YCDate,120) and convert(varchar(10),q.fdate,120)<=convert(varchar(10),@ViewDate,120)) )) from #tb A 解释一下,log_store中,如果iflag=0,代表入,1=代表出,总的意思是我建了一个临时表#tb,想一次性的搜索出某段时间内,某部门的物质总入-总出,最后再加入年初盘点时的数量,最后输出该临时表
YangYun 2018-02-13
  • 打赏
  • 举报
回复
引用 4 楼 zjcxc 的回复:
或者类似这样
 UPDATE A SET tbA.Num=B.bValue+C.cValue
 FROM tbA A,
	(	SELECT idA, bValue FROM tbB
		--WHERE 条件
	)B,
	(	SELECT idA, sum(tbC.cValue) as cValue FROM tbC
		--WHERE 条件
		GROUP BY idA
	)C
 WHERE A.idA = B.idA AND A.idA = C.idA
我对sql语言始终搞不清楚 ,只能写点简单,看来受传统语言影响太大,相比你的第一种方法,我觉得你的第二种方法更让我更容易接受,觉得条理更分明。我马上试试你这种方法。
  • 打赏
  • 举报
回复

update data set Num=data.Num+isnull(b.NumB,0) +  isnull((select sum(NumC) from #tbC c where c.idA=data.idA),0) 
from #tbA as data left join #tbB as b on data.idA=b.idA
where data.idA=1
 
  • 打赏
  • 举报
回复
用sql实现虽简单,但也留下了性能隐患,不建议。
zjcxc 2018-02-13
  • 打赏
  • 举报
回复
或者类似这样
 UPDATE A SET tbA.Num=B.bValue+C.cValue
 FROM tbA A,
	(	SELECT idA, bValue FROM tbB
		--WHERE 条件
	)B,
	(	SELECT idA, sum(tbC.cValue) as cValue FROM tbC
		--WHERE 条件
		GROUP BY idA
	)C
 WHERE A.idA = B.idA AND A.idA = C.idA
zjcxc 2018-02-13
  • 打赏
  • 举报
回复
 UPDATE A SET tbA.Num=tbB.bValue+( SELECT sum(tbC.cValue) FROM tbC C WHERE C.idA=a.idA)
 FROM tbA A, tbB B
 WHERE A.idA = B.idA
YangYun 2018-02-13
  • 打赏
  • 举报
回复
update a set a.num=((Select tbB.bValue Where tbB.idA=a.idA and 其它限制条件)+(Select Sum(tbB.bValue) from tbB Where tbB.idA=a.idA and 其它限制条件)) from tbA A 不知这样行不行?我还没试
  • 打赏
  • 举报
回复
实在不会 就用写三条sql执行三次
加载更多回复(6)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧