Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL连接或条件_Sql_Sql Server_Select_Sql Server 2012 - Fatal编程技术网

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并映射所有Worker1Worker2Worker3列?是否有更好的选择和性能影响


注意:来自一家公司的两名工作人员可以处理单个案例,或者所有工作人员都可以来自不同的公司。

尽管连接条件通常是相等检查,但它们没有什么特别之处-任何有效的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