Создание запроса к отчету для привлечения клиентов, только если у них есть открытые счета - PullRequest
0 голосов
/ 31 января 2020

У меня есть запрос, который я пытаюсь использовать, чтобы предоставить моим пользователям список только клиентов, которые в настоящее время имеют открытые учетные записи. Проблема, с которой я сталкиваюсь, заключается в том, что она приносит ВСЕХ клиентов, даже если у них нет текущих учетных записей. Я чувствую, что упускаю что-то простое здесь, но до сих пор не смог заставить это работать так, как задумано.

SELECT Client.Client
FROM dbo.Client 
LEFT JOIN dbo.ClientLink On Client.Client = ClientLink.Client
LEFT JOIN dbo.ClientLink.ExternalId = AccountLink.ExternalId 
LEFT JOIN dbo.AccountLink.Account = Account.Account
GROUP By Client.Client
HAVING SUM(CASE WHEN Account.Closed IS NULL THEN 1 ELSE 0 END) > 0

Ответы [ 3 ]

0 голосов
/ 31 января 2020

Я бы посоветовал переосмыслить ваш запрос, и как вы храните свои данные, это принципиально, поймите это неправильно, тогда запрос к базе данных станет кошмаром, и вы получите неожиданные результаты, например, должен ли Account.Closed быть нулевым? если бы это был я, я бы создал ограничение по умолчанию, которое установило бы новые учетные записи равными 0 (то есть открытые), затем написал бы запрос для обновления учетных записей, которые должны были быть закрыты, и снова установил бы его на 1.

, не зная по-настоящему Как выглядит ваша схема, предоставляя точный ответ, трудно.

Я бы тогда переписал запрос так:

SELECT Client.Client
FROM dbo.Client 
LEFT JOIN dbo.ClientLink On Client.Client = ClientLink.Client
LEFT JOIN dbo.ClientLink.ExternalId = AccountLink.ExternalId 
LEFT JOIN dbo.AccountLink.Account = Account.Account
WHERE Account.Closed = 0 --only return clients with opened accounts

, если это невозможно сделать, я бы переписал Ваш запрос выглядит следующим образом:


SELECT Client.Client, COUNT(Client.Client) AS NumberOfOpenAccounts
FROM dbo.Client 
LEFT JOIN dbo.ClientLink On Client.Client = ClientLink.Client
LEFT JOIN dbo.ClientLink.ExternalId = AccountLink.ExternalId 
LEFT JOIN dbo.AccountLink.Account = Account.Account
WHERE ISNULL(Account.Closed, 1) = 0 --only return clients with opened accounts
GROUP BY Client.Client

0 голосов
/ 31 января 2020

Если вам нужно только имя клиента, вы можете использовать DISTINCT вместо группировки. Что-то вроде приведенного ниже утверждения может помочь:

SELECT Distinct Client.Client
FROM Client 
INNER JOIN ClientLink On Client.Client = ClientLink.Client
INNER JOIN AccountLink On ClientLink.ExternalId = AccountLink.ExternalId 
INNER JOIN Account on AccountLink.Account = Account.Account
WHERE Account.Closed IS NULL

Надеюсь, это поможет.

0 голосов
/ 31 января 2020

Я предполагаю, что если у клиентов нет учетных записей, то ссылки между таблицами могут быть удалены. Если это так, решение состоит в том, чтобы просто использовать INNER JOIN.

Ваш синтаксис также все испорчен. Но запрос, который вы хотите, может быть:

SELECT c.Client
FROM dbo.Client c JOIN
     dbo.ClientLink cl
     AccountLink al
     ON cl.ExternalId = al.ExternalId JOIN
     Account a
     ON a.Account = al.Account
GROUP By c.Client
HAVING SUM(CASE WHEN Account.Closed IS NULL THEN 1 ELSE 0 END) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...