SQL连接或条件
我有一张表,上面写着“案例”,它使用了来自工人的参考资料作为三列。还有一个表工人所属的公司 以下是模式:SQL连接或条件,sql,sql-server,select,sql-server-2012,Sql,Sql Server,Select,Sql Server 2012,我有一张表,上面写着“案例”,它使用了来自工人的参考资料作为三列。还有一个表工人所属的公司 以下是模式: Cases [ CaseID, CaseNumber, Worker1, Worker2, Worker3 ] Workers [ WorkerID, ComapnyID] Company [CompanyID, CompanyName] 现在我需要每个公司的案例统计。 那么,是否可以使一个连接到worker并映射所有Worker1、Worker2和Worker3列?是否有更好的选择和性
Cases [ CaseID, CaseNumber, Worker1, Worker2, Worker3 ]
Workers [ WorkerID, ComapnyID]
Company [CompanyID, CompanyName]
现在我需要每个公司的案例统计。
那么,是否可以使一个连接到worker并映射所有Worker1、Worker2和Worker3列?是否有更好的选择和性能影响
注意:来自一家公司的两名工作人员可以处理单个案例,或者所有工作人员都可以来自不同的公司。尽管连接条件通常是相等检查,但它们没有什么特别之处-任何有效的SQL条件都可以用于执行连接。在您的情况下,中的
条件似乎合适:
SELECT CompanyName, COUNT(DISTINCT CaseID)
FROM Company co
JOIN Workers w ON co.CompanyId = w.CompanyId
JOIN Cases ca ON w.WorkerId IN (ca.Worker1, ca.Worker2, ca.Worker3)
GROUP BY CompanyName
我建议将您的模式更改为:
cases - caseid, casenumber
workers - workerid, companyid
cases_workers - caseid, workerid
company - companyid, companyname
如果你是这样写的,你可以写:
select companyname, count(*)
from company c
inner join workers w on c.companyid = w.companyid
inner join cases_workers cw on w.workerid = cw.workerid
group by companyname
编辑:
如果您无法更改模式,请使用其他评论员已经提到的一些好的查询。以下是我的版本:
with caselist (
select worker1 as worker from cases union all
select worker2 as worker from cases union all
select worker3 as worker from cases
)
select companyname, count(*)
from company c
inner join workers w on c.companyid = w.companyid
inner join caselist cl on w.workerid = cl.worker
group by companyname
首先,设计有缺陷。您应该有一个类似于CaseWorker(CaseID,WokerID)
的连接表。同意-模式更改是正确的方法。但并非总是可能的:(@IanYates,是的,我同意你的看法。让我编辑我的答案并添加可用于当前schemaSorry的查询,但我不能更改架构,因为它已经构建,并且数据库正在生产中。@dotNetAddict这是可以理解的。我已经适当地编辑了我的答案,使查询与我之前编写的查询有些类似。还记得吗总有一天你会不得不更改模式;越早做可能比晚做更好。请参阅有关模式更改的其他注释。但如果你不能更改,至少可以作弊和取消PIVOT(语法我永远记不清了,所以我改用了UNION ALLs)为了使表格更具虚拟性,我实际上比我更喜欢这个表格,因为它只做锡罐上所说的,其他什么都不做。但是缺少了一个分组。@IanYates Yikes!不知道那里发生了什么。当然,你是对的。我在中编辑了分组依据。这是一个漂亮、简洁的查询!酷!
with caselist (
select worker1 as worker from cases union all
select worker2 as worker from cases union all
select worker3 as worker from cases
)
select companyname, count(*)
from company c
inner join workers w on c.companyid = w.companyid
inner join caselist cl on w.workerid = cl.worker
group by companyname