2013-12-05 2 views
0

Мои фактические таблицы намного сложнее, но вот упрощенный пример проблемы, которую я пытаюсь решить.Поиск суммы поля в связанной таблице для каждой группы с дополнительными критериями поиска

  • Таблица контакт: ContactID, ContactName, В ожидании
  • Таблица покупки: PurchaseID, ContactID, Сумма, Pending Дата
  • Таблица contact_purchase_link: ContactID, PurchaseID (хотя это может показаться таблицы ссылок не является необходимым в этом упрощенном примере это необходимо в большой схеме таблицы)

Вот запрос, который я в настоящее время:

SELECT DISTINCT contact.ContactID, 
       (SELECT SUM(Amount) 
        FROM purchase 
        WHERE purchase.ContactID = contact.ContactID 
        AND purchase.Pending = 0 
       ) totalpurchase 
FROM contact 
INNER JOIN (contact_purchase_link JOIN purchase 
      ON (contact_purchase_link.PurchaseID = purchase.PurchaseID 
      )) 
USING (ContactID) 
WHERE purchase.Date > '2013-12-06' AND 
    AND contact.Pending =0 

Проблема заключается в том, что я хочу, чтобы totalpurchase (сумма поля суммы) ограничивалась критериями поиска таблицы покупки - это означает, что запрос должен возвращать только сумму покупок после указанной даты на контакт. Я думаю, что для использования предложения group by запрос должен основываться на таблице закупок, но мне нужен запрос, чтобы использовать таблицу контактов, чтобы все контакты были указаны вместе с их суммой покупки и другими соответствующими данными клиента. Есть ли способ сделать это в рамках одного запроса?

В целях дальнейшего уточнения:

Этот запрос генерируется как часть поискового механизма. Пример того, почему такой запрос был бы выполнен, заключается в том, что пользователь хотел создать список контактов последних имен, начинающихся с A, с покупками определенного элемента или в этом примере покупок на определенную дату. Таким образом, в общем случае запрос должен был бы генерировать список всех контактов и их данных (с возможными критериями поиска по типу контакта, таким как все последние имена, начинающиеся с «A» и т. Д.), И запрос может также включать критерии поиска на таблицу покупки, такую ​​как дата покупки, и была ли покупка определенной позиции и т. д.

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

+1

Предлагаю вам проверить ваш запрос (как опубликовано) на наличие синтаксических ошибок. –

+1

Я не понимаю, что вы пытаетесь сделать здесь. У вас есть таблица ссылок, но в вашем текущем запросе 'покупка' соединяется непосредственно с' contact' в 'SELECT SUM (Amount)' part. Не могли бы вы добавить примеры данных и ожидаемые результаты? Чтобы помочь прояснить ваш вопрос, образцы данных должны включать в себя пару записей «покупки», которые не будут включены в сумму «totalpurchase». –

+0

Спасибо Я исправил ошибки синтаксиса в запросе. Этот запрос является упрощенным запросом гораздо более сложного запроса, генерируемого поисковой системой. Причина, по которой я оставил прямую ссылку от контакта к таблице покупки, заключается в том, что в реальном запросе она напрямую связана с контактом по умолчанию в таблице закупок. Однако я хотел уйти в join в таблицу contact_purchase_link, потому что это неотъемлемая часть более сложного запроса, и мне нужен ответ, который включает эту часть. – ssp

ответ

0

Если я правильно понимаю ваш вопрос, вам нужно переместить сравнение дат внутри первого подзапроса:

SELECT DISTINCT contact.ContactID, 
       (SELECT SUM(Amount) 
        FROM purchase 
        WHERE purchase.ContactID = contact.ContactID 
        AND purchase.Pending = 0 
        AND purchase.Date > '2013-12-06' 
       ) totalpurchase 
FROM contact 
INNER JOIN (contact_purchase_link JOIN purchase 
      ON (contact_purchase_link.PurchaseID = purchase.PurchaseID 
      ) 
USING (ContactID) 
WHERE purchase.Date > '2013-12-06' 
    AND contact.Pending =0 

Но комментарии правы - я исправил пару, что, как представляется, синтаксические ошибки, и я Не знаю, как присоединиться к contact_purchase_link. Улучшите свой вопрос, и мой ответ будет меньше, чем догадки.

+0

Спасибо @boisvert, что вы правильно поняли вопрос, и ваш ответ даст желаемые результаты. Одна из проблем заключается в том, что, поскольку этот запрос создается как часть поисковой системы, количество критериев поиска зависит от пользователя (конкретные даты, за определенную сумму и т. Д.). С запросом, который вы предлагаете, я бы включил все критерии поиска для таблицы покупки в подвыборку, чтобы сгенерировать общую сумму покупки (и в других аналогичных подвыборках, таких как максимальная покупка), что эффективно? есть ли способ сделать это без добавления критериев поиска к каждому подзапросу? – ssp

+0

@ssp, альтернативой будет использование группы. Но эффективность - это то, что трудно судить абстрактно. Вы можете попробовать запрос, проверить время, план выполнения, попробовать альтернативы и сравнить скорость и план выполнения для этого, а затем добавить некоторые хорошо выбранные индексы. Но если вы найдете ответ полезным, то проголосуйте за него или примите его; если вы находите запрос медленным, задайте второй вопрос, пытаясь получить очень конкретную информацию и принять рекомендации других комментаторов. – boisvert

+0

Я согласен. Мне просто нужно проверить, как долго выполняются запросы с использованием этого метода. Я просто надеялся, что запрос будет казаться менее громоздким. Я изначально думал, что группа будет более эффективной, но я не мог понять, как получить запрос, который будет работать, и дать результаты, которые я хочу. Если бы вы могли привести мне пример, я был бы признателен. – ssp

Смежные вопросы