SQL查询可合并来自多个列的列数据

时间:2018-09-04 22:50:57

标签: sql sql-server python-3.x

SQL Server 2012,Python3。

背景信息:

我有两个桌子。负载和因素。

  1. LOADS包含以下列:

LOADS table

  1. FACTORS具有以下列:

FACTORS table

  1. 表因素基本上是如何合并和分解表LOADS中的数据的路线图。

  2. FACTORS列mlctlc与LOADS表列subcase包含相同的编号。

  3. 在此示例中,我们将仅对32771LOADS使用值eid

问题:

我需要使用类似于LOADS的列来获取一组结果,但要使用其他列,例如: eid, mlc, tlc, fx, fy, fz

要手动执行此操作:

  1. FACTORS的第一行开始。 mlc = 1053002tlc = 4053400
  2. select fx, fy, fz from LOADS where subcase=mlc and eid=32771(这是我们的mlc负载)
  3. select fx, fy, fz from LOADS where subcase=tlc and eid=32771(这是我们的tlc负载)
  4. fx, fy, fz列中的最终值来自以下等式:

    (mlc.fx * mf + tlc.fx * tf) * cf

    (mlc.fy * mf + tlc.fy * tf) * cf

    (mlc.fz * mf + tlc.fz * tf) * cf

  5. 如果tlc=0,则仅使用mlcfx, 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+行,考虑到我的熊猫知识对于现实世界的使用可能不太有效),所以我真的希望将时间减少到几秒钟。 >

1 个答案:

答案 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来解决这种空情况。