寻找合适的连接(获取重复)

时间:2015-06-23 08:12:12

标签: sql sql-server

我在创建查询时遇到问题。但在我问你之前,请看看我需要使用的三个表:

表1 // AdminInvoices

[AdminId] [InvoiceId] (...)

Table_2 // AdminClientSystem

[AdminId] [ClientId] (...)

Table_3 // ClientData

[CompanyId] [CompanyName] (...)

关于表格的更多说明:

TABLE_1

InvoiceId一般不是唯一的,但对公司来说是唯一的:

AdminId     InvoiceId
16              1
14              1
24              1
3149            1
3150            1
3159            2
3157            2
3150            2
3149            2
3145            2
16              3
14              3
24              3
2015            3
3149            3
3159            4
3157            4
3150            4

TABLE_2:

AdminId       CompanyId
3                 1
3                 1
3                 1
3                 1
3                 1
3                 1
3                 2
3                 2
3                 3
3                 4
3                 4
3                 4
3                 9
3                 9
3                 9
3                 9
3                 9
3                 9
3                 9
3                 9
3                 13
3                 13
3                 13

TABLE_3:

CompanyId   CompanyName
1              C1
2              C2
3              C3
9              C4
13             C5

我在使用join创建正确的查询时遇到问题。在我的情况下,我总是得到冗余数据作为答案。我想得到的是每个公司的发票数量

让我们说我确信C1生成了100张发票,C2 50和C3 200.无论我做什么查询,数字大约是两倍甚至更大 - 其他表中的某些行被复制到一般结果

我尝试过:

SELECT CL.CompanyName, count([IncentiveId]) 
FROM AdminInvoices
INNER JOIN AdminClientSystem
  ON AdminInvoices.AdminId = AdminClientSystem.AdminId
INNER JOIN ClientData
  ON AdminClientSystem.CompanyId = ClientData.CompanyId
GROUP BY CL.CompanyName
ORDER BY CL.CompanyName ASC

提前感谢您的帮助! :)

2 个答案:

答案 0 :(得分:3)

就我在您的示例中看到的而言,AdminClientSystem有许多冗余条目,因此对于一个adminid,您有几个带有公司ID的条目。不确定表是否有这样的数据,或者你刚发布了错误的信息。 要仅使用它们一次,您可以使用子查询,例如:

 SELECT CL.CompanyName, count([IncentiveId]) 
 FROM AdminInvoices
 INNER JOIN (select distinct AdminId, CompanyId from AdminClientSystem) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData
 ON ACS.CompanyId= ClientData.CompanyId
 GROUP BY CL.CompanyName
 ORDER BY CL.CompanyName ASC

答案 1 :(得分:0)

试试这个......

 SELECT CL.CompanyName, count([AdminInvoices.InvoiceId]) 
 FROM AdminInvoices 
 INNER JOIN 
 (select distinct(AdminId),CompanyId  
 from AdminClientSystem 
 WHERE CompanyId IN 
 (SELECT DISTINCT CompanyId FROM ClientData)) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData as CL
 ON ACS.CompanyId= CL.CompanyId
 GROUP BY CL.CompanyName