优化这一段sql:SELECT user_worker.Title AS worker, COUNT(CASE WHEN (CASE WHEN bl.Checker = 0 THEN '' WHEN bl.Checker > 0 AND bl.Audited = -1 THEN 'NG' WHEN bl.Checker > 0 AND bl.Audited = 1 THEN 'OK' END) ='' THEN 1 END) as nullstr, COUNT(CASE WHEN (CASE WHEN bl.Checker = 0 THEN '' WHEN bl.Checker > 0 AND bl.Audited = -1 THEN 'NG' WHEN bl.Checker > 0 AND bl.Audited = 1 THEN 'OK' END) = 'OK' THEN 1 END) as okstr, COUNT(CASE WHEN (CASE WHEN bl.Checker = 0 THEN '' WHEN bl.Checker > 0 AND bl.Audited = -1 THEN 'NG' WHEN bl.Checker > 0 AND bl.Audited = 1 THEN 'OK' END) = 'NG' THEN 1 END) as NGstr, (COUNT(CASE WHEN (CASE WHEN bl.Checker = 0 THEN '' WHEN bl.Checker > 0 AND bl.Audited = -1 THEN 'NG' WHEN bl.Checker > 0 AND bl.Audited = 1 THEN 'OK' END) = 'OK' THEN 1 END) +COUNT(CASE WHEN (CASE WHEN bl.Checker = 0 THEN '' WHEN bl.Checker > 0 AND bl.Audited = -1 THEN 'NG' WHEN bl.Checker > 0 AND bl.Audited = 1 THEN 'OK' END) ='' THEN 1 END) )as totalOKStr FROM [bdWorkOrderList] bl LEFT JOIN [bdWorkOrder] bd ON bl.OrderID = bd.ID LEFT JOIN [reportMJWXJL] rwx ON bl.OrderID = rwx.OrderID LEFT JOIN [reportMJQHLHJL] rqh ON bl.OrderID = rqh.OrderID LEFT JOIN user_worker ON user_worker.ID = bl.Worker WHERE bd.IsDeleted = 0 AND bl.StepName LIKE 'Maker%' AND bl.StepName IN ('Maker修模', 'maker切换料号', 'Maker模具保养') AND DATEPART(MONTH, bl.StartTime) = DATEPART(MONTH, GETDATE()) and DATEPART(YEAR, bl.StartTime) = DATEPART(YEAR, GETDATE()) GROUP BY user_worker.Title)
时间: 2024-02-14 09:30:58 浏览: 66
你可以尝试优化以上SQL查询的性能:
```sql
WITH CTE_Counts AS (
SELECT
user_worker.Title AS worker,
COUNT(CASE WHEN bl.Checker = 0 THEN 1 END) AS nullstr,
COUNT(CASE WHEN bl.Audited = -1 THEN 1 END) AS NGstr,
COUNT(CASE WHEN bl.Audited = 1 THEN 1 END) AS okstr
FROM [bdWorkOrderList] bl
LEFT JOIN [bdWorkOrder] bd ON bl.OrderID = bd.ID
LEFT JOIN [reportMJWXJL] rwx ON bl.OrderID = rwx.OrderID
LEFT JOIN [reportMJQHLHJL] rqh ON bl.OrderID = rqh.OrderID
LEFT JOIN user_worker ON user_worker.ID = bl.Worker
WHERE bd.IsDeleted = 0
AND bl.StepName LIKE 'Maker%'
AND bl.StepName IN ('Maker修模', 'maker切换料号', 'Maker模具保养')
AND DATEPART(MONTH, bl.StartTime) = DATEPART(MONTH, GETDATE())
AND DATEPART(YEAR, bl.StartTime) = DATEPART(YEAR, GETDATE())
GROUP BY user_worker.Title
)
SELECT
worker,
nullstr,
NGstr,
okstr,
(nullstr + okstr) AS totalOKStr
FROM CTE_Counts;
```
在上述优化中,我使用了一个公共表表达式(CTE)来计算每个分类的数量。通过将计算逻辑放在CTE中,可以提高查询的可读性和性能。然后,从CTE中选择所需的列,并计算总的OK数量。
请注意,为了进一步优化查询性能,你可能需要创建适当的索引来支持查询中使用的过滤和连接操作。具体索引的创建需要根据表结构和查询需求进行评估和调整。
阅读全文