【发布时间】:2020-01-31 14:18:27
【问题描述】:
我有一个包含机器数据的表。其中包括(唯一)设备编号 (EMEQP#)、财务成本 (EMCOST)、当前值 (EMBOOK) 和设备链接 (EMLEQP) 列。一些机器由其他几台机器组成,这些机器通过将“父”机器的 EMQP# 放在 EMLEQP 列中来链接。有时会填充父级的 EMLEQP(使用其自己的 EMEQP#),但也可以为空。也不是每个父母都有孩子,但即使这样,EMLEQP 也可以填写或不填写。
这是数据的简化示例:
EMEQP# | EMLEQP | EMCOST | EMBOOK
ACMD001 | ACMD001 | 10 | 12
ACMD001A | ACMD001 | 8 | 1
ACMD002 | NULL | 10 | 12
SLE003 | NULL | 11 | 5
RUP5120 | SLE003 | 12 | 7
所以在这种情况下,ACMD001、ACMD002 和 SLE003 是父机器(因为 EMLEQP 为空或与 EMEQP# 相同。ACMD001A 是 ACMD001 的子机器,而 RUP5120 是 SLE003 的子机器。
查询结果应该是:
EMEQP# | EMCOST | EMBOOK
ACMD001 | 18 | 13
ACMD002 | 10 | 12
SLE003 | 23 | 12
我需要知道每台机器的 EMCOST 和 EMBOOK 总数,即父级和任何子级的总和。起初我尝试在 EMLEQP 上使用 group by,但这不起作用,因为它可以在父级上为空。
接下来我尝试使用子查询。主查询选择所有父节点 (WHERE EMLEQP = EMEQP# OR EMLEQP = ''),子查询计算所有机器的总和,其中 EMLEQP 是父节点的 EMEQP#(或为空以包括父节点)。到目前为止,这是我计算 EMCOST 总和的内容。
SELECT EMEQP#,
(SELECT SUM(b.emcost)
FROM uv_EQPMASFL AS b
WHERE
(b.emleqp = a.emeqp# AND b.emeqp# <> a.emeqp# OR b.emeqp# = a.emeqp#) 'EMCOST'
FROM uv_EQPMASFL a
WHERE
(EMLEQP = EMEQP# or EMLEQP = '')
此查询有效,但速度极慢。运行它需要超过 15 分钟,我什至还没有添加第二个总和。由于我不能在子查询中使用两列,我需要添加第二个子查询来获得第二个总和。最后,如果我能得到另一列来指示属于父级(包括父级)的机器的数量,我也希望它。
必须有更好、更有效的方法来获取这些数据,但我不知道如何。
【问题讨论】:
标签: sql-server tsql sql-server-2016