select a.生产线,a.工单号,b.工序,a.设备编号,a.点检项目,a.内容与方法,a.基准值,a.定期时长,a.单位,convert(date,a.下次点检日期) as 下次点检日期 ,a.类型区分,a.频率,次数 from (SELECT 生产线,工单号,设备编号,点检项目,内容与方法,基准值,定期时长,单位,下次点检日期,类型区分, CASE WHEN 单位 = '月' THEN FLOOR(12 / 定期时长) WHEN 单位 = '天' THEN FLOOR(365 / 定期时长) ELSE NULL END AS 频率, (SELECT count(1) FROM [dbo].[dwd_设备_点检单一览] a1 where 实施部门='现场' and year(预计点检日期)=2025 and 实际完成日期 is not null and 作业状态='已完成' and 生产线 in ('缸体_TNGA1线' , '缸体_TNGA2线') and a1.关联工单 =b1.工单号 ) as 次数 FROM [dbo].[dwd_设备_定期台账一览] b1 where 1=1 ${if(len(生产线)==0,"","and 生产线 in ('" +生产线+ "')")} and 作业部门='现场' and year(下次点检日期)>=2025 and 台账状态='启用' and 生产线 in ('缸体_TNGA1线' , '缸体_TNGA2线') ) as a left join (SELECT DISTINCT op as 工序, mc_no as 设备编号 FROM 现场DB.dbo.T_fault_tag_edit) as b on a.设备编号=b.设备编号 where 1=1 ${if(len(工序)==0,"","and 工序 in ('" +工序+ "')")} ${if(len(次数)==0,"","and 次数 in ('" +次数+ "')")} order by a.下次点检日期 asc 以上语句加入 select 台账号,工单号 from dbo.dwd_TPM实施 where 作业状态='已完成',台账号作业关联条件,计算工单号次数,加入到以上语句中
时间: 2025-07-29 20:24:14 AIGC 浏览: 20
<think>我们有一个需求:在已有的SQL查询中,需要加入从表`dbo.dwd_TPM实施`中获取的“台账号”和“工单号”,并且根据这个表来计算每个工单号在特定条件下的完成次数,然后将这个次数加入到原查询中。
原查询已经有一个子查询a,其中计算了次数(原次数计算方式):
次数 = (SELECT count(1) FROM [dbo].[dwd_设备_点检单一览] a1
where 实施部门='现场'
and year(预计点检日期)=2025
and 实际完成日期 is not null
and 作业状态='已完成'
and 生产线 in ('缸体_TNGA1线' , '缸体_TNGA2线')
and a1.关联工单 = b1.工单号)
现在要求改为:计算工单号次数时,使用表`dbo.dwd_TPM实施`,条件为作业状态='已完成',并且通过“台账号”关联(原表b1中可能没有直接关联字段,但原查询中a1表关联工单用的是b1.工单号,现在需要改为关联新的表)。
但是,原查询中的b1表(即[dwd_设备_定期台账一览])的字段我们不清楚,而新需求要求加入“台账号”和“工单号”并关联。然而,原查询中已经有一个工单号(来自b1),所以我们需要明确:
1. 新加入的表`dwd_TPM实施`与原来的表如何关联?根据需求描述,应该是通过“台账号”关联,但原查询中并没有“台账号”字段。我们需要查看原表结构,但这里没有给出。
2. 原查询中的次数计算是统计每个工单号在点检单一览表中的完成次数,现在要求改为从`dwd_TPM实施`表中统计,并且关联条件变为“台账号”。
由于原查询中并没有“台账号”,所以我们需要在子查询a中先获取“台账号”。但是,原表`dwd_设备_定期台账一览`(即b1)中是否有“台账号”字段?如果没有,我们就无法关联。
考虑到需求描述可能不完整,我们假设原表`dwd_设备_定期台账一览`中有一个字段可以关联到`dwd_TPM实施`的“台账号”,比如可能叫“台账号”或者“台账编号”等。但原查询中没有这个字段,所以我们需要修改。
由于问题中没有明确给出表结构,我们只能根据需求推测:
需求:加入 select 台账号,工单号 from dbo.dwd_TPM实施 where 作业状态='已完成',台账号作业关联条件,计算工单号次数
所以,我们需要在子查询a中关联`dwd_TPM实施`表,通过“台账号”关联,然后计算每个工单号(这里可能是`dwd_TPM实施`中的工单号)在2025年完成的次数。
但是,原查询中的工单号是来自`dwd_设备_定期台账一览`(b1)的,而新表`dwd_TPM实施`中也有工单号,我们需要确定如何关联。
根据需求描述,我们可能需要将原次数计算改为:
次数 = (SELECT COUNT(1)
FROM dbo.dwd_TPM实施 tpm
WHERE tpm.作业状态 = '已完成'
AND tpm.台账号 = b1.台账号 -- 这里假设b1表有台账号字段,但原查询中没有
AND YEAR(tpm.预计点检日期) = 2025 -- 注意:新表中是否有预计点检日期?还是实际完成日期?
... 其他条件可能需要调整
)
然而,原表b1(定期台账一览)中并没有“台账号”字段,所以我们需要调整。
另一种可能:原表`dwd_设备_定期台账一览`中的某个字段(比如设备编号?台账ID?)对应`dwd_TPM实施`中的“台账号”。由于没有具体表结构,我们假设在`dwd_设备_定期台账一览`中有一个唯一标识台账的字段,比如“台账ID”,而`dwd_TPM实施`中有一个字段“台账号”就是台账ID。
因此,我们需要修改子查询a,在SELECT列表中加入“台账号”(即台账ID),然后将其用于关联。但原查询中并没有这个字段,所以我们需要先修改子查询a,将台账的唯一标识(假设叫“台账ID”)取出来,然后用于关联`dwd_TPM实施`表。
但是,原查询中并没有显示“台账ID”字段,所以我们需要添加。
由于原需求描述不是很清晰,我们只能按照以下思路修改:
步骤:
1. 在子查询a(即从[dwd_设备_定期台账一览]中取数据的子查询)中,我们假设该表有“台账ID”字段(我们暂且命名为“台账号”,或者如果原表没有,那么可能需要使用其他字段关联,这里假设原表有唯一标识台账的字段,我们称之为“台账ID”)。
2. 然后,我们使用这个“台账ID”去关联`dwd_TPM实施`表的“台账号”。
3. 计算次数时,统计每个台账在2025年完成的次数(即`dwd_TPM实施`中作业状态为已完成,并且年份为2025的记录数)。
修改后的子查询a中的次数计算部分:
次数 = (SELECT COUNT(1)
FROM dbo.dwd_TPM实施 tpm
WHERE tpm.台账号 = b1.台账ID -- 假设b1表中台账的唯一标识字段叫“台账ID”
AND tpm.作业状态 = '已完成'
AND YEAR(tpm.预计点检日期) = 2025 -- 这里使用预计点检日期还是实际完成日期?原条件中使用了实际完成日期,但新表可能有不同字段
-- 原条件中还有生产线等,但新表中可能没有,所以这里可能需要调整
)
但是,原条件中还有生产线等条件,而新表`dwd_TPM实施`中可能没有生产线字段,所以这些条件可能无法加入。因此,我们需要根据实际表结构调整。
由于问题描述有限,我们假设新表`dwd_TPM实施`中包含了台账ID(即台账号)和工单号,并且有预计点检日期和实际完成日期,以及作业状态。
另外,原需求要求“加入到以上语句中”,并且要求“计算工单号次数”,这里注意:原次数计算是按工单号(b1.工单号)统计的,现在要改为按台账ID统计该台账在2025年完成的次数?还是按工单号统计?需求描述是“计算工单号次数”,但是关联条件却是“台账号”,所以这里应该是按台账ID统计次数,而不是工单号。
但是,原需求描述中要求“计算工单号次数”,可能是指在新表中,同一个台账ID可能对应多个工单号(多次点检),所以我们统计的是每个台账ID在2025年完成的次数(即工单数)。
因此,我们修改子查询a中的次数计算部分,改为从`dwd_TPM实施`中统计。
同时,我们还需要在最终结果中展示“台账号”和“工单号”(来自`dwd_TPM实施`)?但是原查询结果中并没有这些字段,所以我们需要在子查询a中加入吗?需求没有明确,但要求“加入select台账号,工单号”,所以我们需要在最终结果中展示。
因此,我们需要在子查询a中增加两个字段:台账ID(作为台账号)和来自`dwd_TPM实施`的工单号?但是,一个台账可能对应多个工单号(多次点检),所以这里不能直接关联,因为会导致重复。
我们可能需要改变思路:
由于原查询是列出每个定期台账的明细,然后关联工序,现在要求加入台账的完成情况(次数)以及该台账对应的工单号(可能是最近一次?或者所有?),但需求没有明确。
考虑到需求描述不完整,我们只能按照以下方式修改:
1. 在子查询a中,我们加入“台账ID”(假设原表b1中字段名为“台账ID”),并且计算次数(按台账ID在dwd_TPM实施中统计2025年完成次数)。
2. 同时,我们可能还需要展示该台账对应的工单号,但是一个台账在2025年可能有多个工单,所以我们可以展示一个聚合的字符串(例如,用逗号分隔的工单号列表)?或者只展示一个(最大或最小的工单号)?需求没有明确。
但是,原需求只要求加入“台账号,工单号”,并没有说如何处理多个,所以这里我们可能需要改变结果集的结构。由于原查询结果中每个设备点检项目是一行,如果加入多个工单号会导致多行,所以这里我们只统计次数,不展示具体的工单号列表。
所以,我们只修改次数计算部分,不展示具体的工单号。如果需求要求展示工单号,那么我们需要改变查询方式,可能使用分组拼接字符串。
根据以上分析,我们假设原表`dwd_设备_定期台账一览`有“台账ID”字段,然后修改子查询a中的次数计算部分,并添加“台账ID”字段(作为台账号)到结果中,但最终结果是否展示台账号?需求没有明确,所以先加上。
修改后的SQL如下(注意:由于表结构不明确,以下代码为示例,需要根据实际字段调整):</think>根据你的需求,我修改了SQL语句,加入了`dwd_TPM实施`表的关联,并重新计算了工单号完成次数。以下是优化后的代码:
```sql
SELECT
a.生产线,
a.工单号,
b.工序,
a.设备编号,
a.点检项目,
a.内容与方法,
a.基准值,
a.定期时长,
a.单位,
CONVERT(DATE, a.下次点检日期) AS 下次点检日期,
a.类型区分,
a.频率,
tpm.完成次数 AS 次数 -- 使用TPM实施表的完成次数
FROM
(
SELECT
生产线, 工单号, 设备编号, 点检项目, 内容与方法, 基准值,
定期时长, 单位, 下次点检日期, 类型区分,
CASE
WHEN 单位 = '月' THEN FLOOR(12 / 定期时长)
WHEN 单位 = '天' THEN FLOOR(365 / 定期时长)
ELSE NULL
END AS 频率,
台账ID -- 新增台账ID用于关联
FROM [dbo].[dwd_设备_定期台账一览] b1
WHERE 1=1
${if(len(生产线)==0,"","AND 生产线 IN ('" + 生产线 + "')")}
AND 作业部门 = '现场'
AND YEAR(下次点检日期) >= 2025
AND 台账状态 = '启用'
AND 生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线')
) AS a
LEFT JOIN (
SELECT DISTINCT op AS 工序, mc_no AS 设备编号
FROM 现场DB.dbo.T_fault_tag_edit
) AS b ON a.设备编号 = b.设备编号
-- 新增TPM实施表关联
LEFT JOIN (
SELECT
台账号,
关联工单 AS 工单号,
COUNT(*) AS 完成次数 -- 计算完成次数
FROM [dbo].[dwd_TPM实施]
WHERE
作业状态 = '已完成'
AND 实施部门 = '现场'
AND YEAR(预计点检日期) = 2025
AND 生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线')
GROUP BY 台账号, 关联工单
) AS tpm ON a.台账ID = tpm.台账号 AND a.工单号 = tpm.工单号
WHERE 1=1
${if(len(工序)==0,"","AND 工序 IN ('" + 工序 + "')")}
${if(len(次数)==0,"","AND tpm.完成次数 IN ('" + 次数 + "')")}
ORDER BY a.下次点检日期 ASC
```
### 主要修改说明:
1. **新增台账ID字段**:
- 在子查询`a`中添加了`台账ID`字段,用于关联TPM实施表
- 实际字段名需根据你的表结构调整(示例中使用`台账ID`)
2. **TPM实施表关联**:
```sql
LEFT JOIN (
SELECT
台账号,
关联工单 AS 工单号,
COUNT(*) AS 完成次数
FROM [dbo].[dwd_TPM实施]
WHERE
作业状态 = '已完成'
AND 实施部门 = '现场'
AND YEAR(预计点检日期) = 2025
AND 生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线')
GROUP BY 台账号, 关联工单
) AS tpm ON a.台账ID = tpm.台账号 AND a.工单号 = tpm.工单号
```
- 通过`台账号`和`工单号`双重关联确保准确性
- 使用`COUNT(*)`统计已完成点检的次数
- 过滤条件保持与原逻辑一致
3. **次数计算优化**:
- 移除了原有的子查询计数,改用TPM实施表的聚合结果
- 次数条件判断改为:`tpm.完成次数 IN ('" + 次数 + "')`
4. **结果集调整**:
- 最终输出的`次数`字段来自TPM实施表的`完成次数`
### 注意事项:
1. 请确认`dwd_设备_定期台账一览`表中台账唯一标识字段的实际名称(示例中使用`台账ID`)
2. 如果`dwd_TPM实施`表中没有`实施部门`或`生产线`字段,需移除相关过滤条件
3. 关联条件可能需要根据实际业务调整(如使用`ON a.台账ID = tpm.台账号`)
阅读全文
相关推荐













