Синтаксис SQL для сложного сценария (предложения) - PullRequest
1 голос
/ 07 июня 2010

у меня сложный запрос, который нужно написать, но я не могу его понять

вот мои столы

Продажа - одна строка для каждой продажи, совершенной в системе
SaleProducts - одна строка для каждой строки в счете-фактуре (аналогично OrderDetails в NW)
Предложения - список возможных сделок / предложений, на которые может иметь право продажа
DealProducts - список товаров, которые необходимо приобрести, чтобы получить сделку

сейчас я пытаюсь сделать запрос, который будет сообщать мне о каждой сделке, по которой он может получить

соответствующие поля:

Продажа: SaleID (PK)
SaleProducts: SaleID (FK), ProductID (FK)
Специальные предложения: DealID (PK)
DealProducts: DealID (FK), ProductID (FK), мандаты (int) для требуемого кол-ва

Я считаю, что я должен иметь возможность использовать какое-то перекрестное или внешнее соединение, но это не работает

вот один пример (около 30 вещей, которые я пробовал)

SELECT  DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories, 
        viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount
FROM    DealProducts 
            LEFT OUTER JOIN viwSaleProductCount 
                ON DealProducts.ProductID = viwSaleProductCount.ProductID
GROUP BY DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories, 
         viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount

Проблема в том, что он не показывает никаких сделок с товарами, которые не были выполнены (возможно, из-за объединения ProductID). Мне нужно, чтобы также появлялись продажи, не соответствующие требованиям, тогда я могу отфильтровать любой SaleID, который существует в этом запросе where AmountBought < Mandatories и т.д.

Спасибо за вашу помощь

1 Ответ

1 голос
/ 07 июня 2010

Я не уверен, насколько хорошо я слежу за вашим вопросом (где подходит viwSaleProductCount?), Но похоже, что вам нужно внешнее соединение с подзапросом, который возвращает список сделок вместе со связанными продуктами. Я думаю, что это будет примерно так:

Select *
From Sales s Inner Join SaleProducts sp on s.SaleID = sp.SaleID
    Left Join (
        Select *
        From Deals d Inner Join DealProducts dp on d.DealID = dp.DealId
    ) as sub on sp.ProductID = sub.ProductID

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

edit: если вам на самом деле не нужна информация из таблиц продаж или сделок, можно использовать что-то подобное:

Select sp.SaleID, sp.ProductID, sp.ProductCount, dp.DealID, dp.Mandatories
From SaleProducts sp
    Left Join DealProducts as dp on sp.ProductID = dp.ProductID

Если вам нужно выполнить группировку / агрегацию для этого результата, вам нужно быть осторожным, чтобы убедиться, что сделки не учитываются несколько раз для данной продажи (Count Distinct может быть подходящим, в зависимости от вашей группировки). Поскольку это левое соединение, вам не нужно беспокоиться об исключении продаж, которые не совпадают в DealProducts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...