Мой вопрос о SQL, используя функцию TOP внутри подзапроса в MS Access - PullRequest
1 голос
/ 01 мая 2019

В целом я пытаюсь добиться запроса, который показывает наиболее упорядоченный товар от клиента в базе данных. Чтобы добиться этого, я попытался сделать запрос, показывающий, сколько раз клиент заказывал товар, и теперь я пытаюсь создать в нем подзапрос, используя TOP1, чтобы определить самые покупаемые товары.

Here is a picture of my relationships

Here is the results of the first query

С SQL из первого запроса (выглядит странно, потому что я сделал это с помощью автоматического создателя Access):

SELECT
    Customers.CustomerFirstName,
    Customers.CustomerLastName,
    Products.ProductName,
    COUNT(SalesQuantity.ProductCode) AS CountOfProductCode
FROM (Employees
INNER JOIN (Customers
    INNER JOIN Sales
        ON Customers.CustomerCode = Sales.CustomerCode)
    ON Employees.EmployeeCode = Sales.EmployeeCode) 
        INNER JOIN (Products
            INNER JOIN SalesQuantity
                ON Products.ProductCode = SalesQuantity.ProductCode)
            ON Sales.SalesCode = SalesQuantity.SalesCode
GROUP BY
    Customers.CustomerFirstName,
    Customers.CustomerLastName,
    Products.ProductName
ORDER BY
    COUNT(SalesQuantity.ProductCode) DESC;

Я попытался вставить подзапрос после строки FROM:

(SELECT TOP1 CountOfProduct(s)
FROM (.....)
ORDER by Count(SalesQuantity.ProductCode) DESC)

Я просто не уверен, что вставлять для «от» - каждый другой учебник содержит данные из уже созданной таблицы, однако это из запроса, который делается в то же время. Просто возиться я поставил "ОТ", а затем перечислил каждую таблицу, а также

FROM Count(SalesQuantity.ProductCode)

только потому, что я видел это в порядке из другого кода и предположил, что запрос отличается от этого количества. Обе попытки завершились с ошибкой в ​​синтаксисе строки «ОТ».

Я новичок в SQL, извините, если это очевидно, но любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

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

Это ответ на ваш вопрос.Он не изменяет ваш запрос, который имеет только косвенное отношение.

SELECT s.CustomerCode, sq.ProductCode, SUM(sq.quantity) as qty
FROM Sales as s INNER JOIN
     SalesQuantity as sq
     ON s.SalesCode = sq.SalesCode
GROUP BY s.CustomerCode, sq.ProductCode;

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

SELECT s.CustomerCode, sq.ProductCode, SUM(sq.quantity) as qty
FROM Sales as s INNER JOIN
     SalesQuantity as sq
     ON s.SalesCode = sq.SalesCode
GROUP BY s.CustomerCode, sq.ProductCode
HAVING sq.ProductCode IN (SELECT TOP 1 sq2.ProductCode
                          FROM Sales as s2 INNER JOIN
                               SalesQuantity as sq2
                               ON s2.SalesCode = sq2.SalesCode
                          WHERE s2.CustomerCode = s.CustomerCode
                          GROUP BY sq2.ProductCode
                         );

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

0 голосов
/ 01 мая 2019

Как я понимаю, вам нужен самый покупаемый продукт для каждого покупателя.

Итак, начните с построения сводного запроса, который подсчитывает покупки продукта покупателем (кажется, что это делается в опубликованном изображении).Включение идентификатора клиента в запрос упростит следующий шаг - создание другого запроса с TOP N вложенным запросом.

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

SELECT * FROM Query1 WHERE CustomerID & ProductName IN 
    (SELECT TOP 1 CustomerID & ProductName FROM Query1 AS Dupe 
     WHERE Dupe.CustomerID = Query1.CustomerID 
     ORDER BY Dupe.CustomerID, Dupe.CountOfProductCode DESC); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...