2015-06-23 1 views
0

У меня проблема с созданием запроса. Но прежде чем я прошу вас о них, пожалуйста, посмотрите на три таблицы, мне нужно использовать:Ищет правильное соединение (получение дубликатов)

Table_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 

У меня есть проблема с созданием соответствующего запроса с объединением. В моем случае я всегда получал избыточные данные в качестве ответа. Я бы хотел получить количество счетов-фактур на одну компанию.

Скажем, что я уверен, что 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 

Заранее спасибо за любую помощь! :)

+1

Я прав, рассматривая это как SQL, а не MySQL? – Simone

ответ

3

Насколько я могу видеть в вашем примере, у AdminClientSystem много избыточных записей, поэтому для одного администратора вы получили несколько записей с идентификатором компании. Не уверен, что таблица действительно имеет данные таким образом, или вы просто отправили что-то не так. Чтобы использовать их только один раз, вы можете использовать подзапрос, как:

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 
+0

Я попробую сделать это за секунду, и да - AdminClientSystem имеет много избыточных данных в первых двух столбцах, другие столбцы в таблице отличаются. –

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 
Смежные вопросы