SQL Server 2012 - 有没有更好的方法来执行此操作,因为当存在重复项时,它会多次计算它们?

时间:2016-05-23 21:54:07

标签: sql sql-server

这不准确,因为计数可能是错误的,所以有更好的方法使用存在吗?我想确定每门课程是否存在一个案例。

SELECT     
    IdentityCourses.IdentityID AS ID,Identities.LastName AS LastName, 
    Identities.FirstNames AS FirstName,Units.UnitID, Units.Description AS Unit
FROM       
    dbo.UnitIdentities 
INNER JOIN
    dbo.IdentityCourses ON dbo.UnitIdentities.IdentityID = dbo.IdentityCourses.IdentityID 
INNER JOIN
    dbo.COCSourceCourses ON dbo.IdentityCourses.CourseID = dbo.COCSourceCourses.CBESCourseID 
INNER JOIN
    dbo.Identities ON dbo.UnitIdentities.IdentityID = dbo.Identities.IdentityID 
INNER JOIN
    dbo.Units ON dbo.UnitIdentities.UnitID = dbo.Units.UnitID
WHERE      
    (dbo.UnitIdentities.IsActiveMember = 1) 
GROUP BY 
    IdentityCourses.IdentityID, Identities.LastName, Identities.FirstNames, 
    Units.Description, Units.UnitID
HAVING
    (SUM((CASE WHEN COCSourceCourses.COCID = 10048 then 1 else 0 end)+
         (CASE WHEN COCSourceCourses.COCID = 10049 then 1 else 0 end)+
         (CASE WHEN COCSourceCourses.COCID = 10050 then 1 else 0 end)+
         (CASE WHEN COCSourceCourses.COCID = 10051 then 1 else 0 end)+
         (CASE WHEN COCSourceCourses.COCID = 10063 then 1 else 0 end)+
         (CASE WHEN COCSourceCourses.COCID = 10073 then 1 else 0 end))) = 6
    AND IdentityCourses.IdentityID NOT IN (SELECT IdentityID 
                                           FROM IdentityQualifications 
                                           WHERE QualificationID IN (1012, 1014, 1025))
ORDER BY 
    Units.UnitID

2 个答案:

答案 0 :(得分:0)

尝试使用count(distinct ..):

SELECT (..columns..)
  FROM dbo.UnitIdentities UI
  LEFT JOIN IdentityQualifications IQ
         ON IQ.IdentityID = UI.IdentityID
        AND IQ.QualificationID IN (1012, 1014, 1025)
 INNER JOIN dbo.IdentityCourses IC
         ON IC.IdentityID = dbo.UnitIdentities.IdentityID
 INNER JOIN dbo.COCSourceCourses COC
         ON COC.CBESCourseID = IC.CourseID
        AND COC.COCID IN (10048, 10049, 10050, 10051, 10063, 10073)
(..two more table joins on identities and units..)
 WHERE IQ.IdentityID IS NULL
 GROUP BY (..columns..)
HAVING COUNT(DISTINCT COC.COCID) = 6
ORDER BY Units.UnitID

答案 1 :(得分:0)

如果您只对某些记录感兴趣,那么为什么不使用WHERE条款呢?只选择您感兴趣的COCID,然后计算不同的结果。

顺便说一下,您不需要任何GROUP BYHAVING,因为您只显示身份/单位,因此您可以在WHERE的子查询中计算相关课程子句。

select
  i.identityid as id,
  i.lastname as lastname,
  i.firstnames as firstname,
  u.unitid,
  u.description as unit
from dbo.identities i
join dbo.unitidentities ui on ui.identityid = i.identityid and ui.isactivemember = 1
join dbo.units u on u.unitid = ui.unitid
where i.identityid not in
(
  select iq.identityid
  from identityqualifications iq
  where iq.qualificationid in (1012, 1014, 1025)
)
and
(
  select count(distinct sc.cocid)
  from dbo.cocsourcecourses sc
  join dbo.identitycourses ic on ic.courseid = sc.cbescourseid
  where sc.cocid in (10048, 10049, 10050, 10051, 10063, 10073)
  and ic.identityid = i.identityid
) = 6
order by u.unitid;