SQL Server 2012,Python3。
背景信息:
我有两个桌子。负载和因素。
表因素基本上是如何合并和分解表LOADS中的数据的路线图。
FACTORS列mlc
和tlc
与LOADS表列subcase
包含相同的编号。
在此示例中,我们将仅对32771
列LOADS
使用值eid
。
问题:
我需要使用类似于LOADS的列来获取一组结果,但要使用其他列,例如:
eid, mlc, tlc, fx, fy, fz
。
要手动执行此操作:
FACTORS
的第一行开始。 mlc
= 1053002
,tlc
= 4053400
select fx, fy, fz from LOADS where subcase=mlc and eid=32771
(这是我们的mlc负载)select fx, fy, fz from LOADS where subcase=tlc and eid=32771
(这是我们的tlc负载) fx, fy, fz
列中的最终值来自以下等式:
(mlc.fx * mf + tlc.fx * tf) * cf
(mlc.fy * mf + tlc.fy * tf) * cf
(mlc.fz * mf + tlc.fz * tf) * cf
如果tlc=0
,则仅使用mlc
。 fx, fy, fz
值来自以下等式:
(mlc.fx * mf) * cf
(mlc.fy * mf) * cf
(mlc.fz * mf) * cf
我在使用SQL的初学者和中级之间,所以我不知道如何仅使用SQL来做到这一点。我已经使用pandas
成功地做到了这一点,基本上是通过创建空白的DataFrame,计算(3)DOF fx,fy,fz
并一次添加一个Rows,并从头开始构建DataFrame来完成的。如果有人需要查看,我可以 共享该代码,但是如果可能的话,我真的很想在SQL中进行共享。原因是因为使用此过程进行的大多数常规查询可能需要几分钟(对于50,000+行,考虑到我的熊猫知识对于现实世界的使用可能不太有效),所以我真的希望将时间减少到几秒钟。 >
答案 0 :(得分:1)
在ZLK的评论之后,您似乎想要这样:
select
LoadsMlc.eid,
Factors.mlc,
Factors.tlc,
(LoadsMlc.fx * Factors.mf + isnull(LoadsTlc.fx * Factors.tf, 0)) * Factors.cf fx,
(LoadsMlc.fy * Factors.mf + isnull(LoadsTlc.fy * Factors.tf, 0)) * Factors.cf fy,
(LoadsMlc.fz * Factors.mf + isnull(LoadsTlc.fz * Factors.tf, 0)) * Factors.cf fz
from
dbo.Factors
join dbo.Loads LoadsMlc on Factors.mlc = LoadsMlc.subcase
left outer join dbo.Loads LoadsTlc on nullif(Factors.tlc, 0) = LoadsTlc.subcase
这假设与mlc
的小写存在一个完全匹配的问题-您的问题当前未指示一种或另一种方式。您可能想添加
where
LoadsTlc.eid is null -- We didn't find a tlc (it was 0)
or LoadsMlc.eid = LoadsTlc.eid
如果各个因子在“负载”表中可能存在多个匹配项。请注意,tlc
连接是左外部的,如您所指出的,我们仅应在mlc
为0的情况下使用。
第二次加入Loads
的联接使用nullif
来使tlc
为0时的情况无效。在这种情况下,您将不会收到该值的记录。三列通过添加0来解决这种空情况。