2014-10-21 2 views
0

Существует несколько десятков потоков с этим названием, но ни один из найденных мне не помог.SQL Nested Calculation JOIN

У меня есть запрос, состоящий из двух таблиц: таблицы клиентов и таблицы транзакций

Каждый клиент может иметь несколько записей в таблице транзакций. То, что я хочу сделать, - это определенный период времени (предполагать, что даты отслеживаются в таблице «Транзакции»), чтобы каждый клиент в таблице «Клиент» находил три разных расчета из таблицы «Транзакции» для этого клиента. Первое число вычисляет количество выданных кавычек, второе вычисляет # порядков, а третье - общее количество котировок, которые не превращаются в порядок. Сами вычисления действительно не имеют значения, поскольку они связаны с решением этой проблемы.

Я чувствую, что есть какое-то соединение. Я не использую должным образом, чтобы получить правильные значения, но вот что я до сих пор (упрощен).

SELECT Customer.CustomerID, Count(TransactionAlias1.*), Count(TransactionAlias2.*), Count(TransactionAlias3.*) 
FROM Customer 
LEFT JOIN (SELECT * FROM Transactions WHERE [...]) TransactionAlias1 ON 
    TransactionAlias1.CustomerID = Customer.CustomerID 
LEFT JOIN (SELECT * FROM Transactions WHERE [...]) TransactionAlias2 ON 
    TransactionAlias2.CustomerID = Customer.CustomerID 
LEFT JOIN (SELECT * FROM Transactions WHERE [...]) TransactionAlias3 ON 
    TransactionAlias3.CustomerID = Customer.CustomerID 
GROUP BY Customer.CustomerID 

Что для меня странно, что только первые два внутренних соединения создают правильные значения для первых двух графов. Добавление третьего внутреннего соединения отменяет другие значения. Выполнение оператора select внутри каждого внутреннего соединения создает правильный счетчик.

Любая помощь будет принята с благодарностью. Если кто-либо из вас узнает о другой статье StackOverflow, которая касается этой же проблемы, сообщите мне.

ответ

0

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

Вы должны остаться с LEFT JOIN для получения правильных результатов для всех клиентов. Кроме того, вы можете сделать что-то вроде этого:

SELECT Customer.CustomerID, sum(Count1) as Count1, sum(Count2) as Count2, sum(Count3) as Count3 
FROM Customer 
LEFT JOIN (
    SELECT CustomerID, 
    case when ... then 1 else 0 end as Count1, 
    case when ... then 1 else 0 end as Count2, 
    case when ... then 1 else 0 end as Count3 
    FROM Transactions 
) s Txn 
on txn.CustomerID = Customer.CustomerID 
GROUP BY Customer.CustomerID 
+0

Я сказал, что внутреннее соединение в моем сообщении, но я должен был сказать, что левое соединение. Я вообще не использовал внутренние соединения. – Rafiki

0

Кажется мне второй присоединиться должны через отсчитывает.

Что касается переноса критериев из условий объединения в case?

select Customer.CustomerId 
    , count(case when [...] then 1 else null end) as Quote_Count 
    , count(case when [...] then 1 else null end) as Order_count 
    , count(case when [...] then 1 else null end) as Quote_not_order_count 
from Customer 
left join Transactions 
    on Transactions.CustomerId = Customer.CustomerId