22,209
社区成员
发帖
与我相关
我的任务
分享
SELECT a.FIMEI ,
FICMOID,
FPASSQTY= SUM(CASE FJG WHEN 'PASS' THEN 1 ELSE 0 END),
FFAILQTY= SUM(CASE FJG WHEN 'FAIL' THEN 1 ELSE 0 END)
FROM diptb a,ICT b
where a.FImei=b.FImei
AND a.FICMOID=54
GROUP BY a.FIMEI ,
FICMOID
试试看吧。还有如果可以吧表结构以及目前存在的索引提供下 看看具体怎么调优 sql或者加hintif OBJECT_ID('tempdb..#list') is not null drop table #list;
select DISTINCT A.FImei, A.FJG, A.FIcmoID,a.FJG
into #list
from ICT
where FIcmoID = 54
;
with coutlist as(
select FImei, COUNT(1) AS FCountif
from ICT(nolock)
where FImei in(select FImei from #list)
group by FImei
)
select DISTINCT FImei, FJG, FIcmoID, FCountif
from #list a
left join coutlist b on a.FImei=b.FImei
where (A.FJG = 'PASS') OR (A.FJG = 'FAIL') AND (B.FCountif = 1)
--先添加索引,单独执行
CREATE INDEX ix_ICT_FImei_FIcmoID ON ICT(FImei,FIcmoID) INCLUDE(FJG)
--- 以下一并执行
--1.
SELECT FImei,COUNT(1) AS FCountif
INTO #tmp
FROM ICT WITH(NOLOCK)
GROUP BY FImei
--2.
CREATE CLUSTERED INDEX ix_#tmp ON #tmp(FImei)
--3.
SELECT DISTINCT A.FImei,
A.FJG,
A.FIcmoID,
B.FCountif
FROM ICT AS A WITH(NOLOCK)
INNER JOIN #tmp AS B
ON A.FImei = B.FImei AND A.FIcmoID = 54
WHERE (A.FJG = 'PASS')
UNION
SELECT DISTINCT A.FImei,
A.FJG,
A.FIcmoID,
B.FCountif
FROM ICT AS A WITH(NOLOCK)
INNER JOIN #tmp AS B
ON A.FImei = B.FImei AND A.FIcmoID = 54
WHERE (A.FJG = 'FAIL') AND (B.FCountif = 1)
--4. 删除临时表
DROP TABLE #tmp
SELECT FImei, FJG, FIcmoID, FCountif
FROM (SELECT DISTINCT A.FImei, A.FJG, A.FIcmoID, B.FCountif
FROM ICT AS A INNER JOIN
(SELECT FImei, COUNT(1) AS FCountif
FROM ICT
GROUP BY FImei) AS B ON A.FImei = B.FImei
WHERE (A.FJG = 'PASS') OR
(A.FJG = 'FAIL') AND (B.FCountif = 1)) AS c
WHERE (FIcmoID = 54) option (RECOMPILE)