Запрос к базе данных Access: рассчитать изменение цены - PullRequest
0 голосов
/ 29 апреля 2018

Я попытался использовать следующий SQL для создания запроса для расчета изменения цены в таблице истории заказов. При доступе выдается предупреждение «Максимум одна запись может быть возвращена ...» и возвращается одна запись с «#Name?» в каждой области. Может ли кто-нибудь помочь мне с этим запросом, пожалуйста? Очень ценится.

SELECT History.PartNumber,History.Datetime, History.Price, History.Quantity, (SELECT TOP 1 Price FROM History AS History1 
WHERE History1.Datetime < History.Datetime 
AND History1.PartNumber = History.PartNumber ORDER BY History1.Datetime DESC) as PreviousPrice, 
[PreviousPrice]-[Price] as PriceDiff
FROM History
ORDER BY History.PartNumber, History.Datetime DESC

Я протестировал следующий код как подмножество запроса и получил следующую ошибку: Диалоговое окно с ошибкой после нажатия на кнопку ОК, я получил это: # Имя? во всех полях

SELECT 
history.partnumber, 
history.datetime, 
history.price, 
history.quantity, 
(SELECT TOP 1 price 
  FROM   history AS History1 
  WHERE  History1.datetime < history.datetime 
AND History1.partnumber = history.partnumber 
  ORDER  BY History1.datetime DESC
 ) AS PreviousPrice
FROM history

1 Ответ

0 голосов
/ 29 апреля 2018

Вы не можете рассчитать изменение цены для PreviousPrice, поскольку PreviousPrice является псевдонимом для select подзапроса

с использованием подзапроса для создания PreviousPrice столбца

Вы можете попробовать этот запрос.

SELECT t.*,
       (t.previousprice - t.price)  AS PriceDiff  
FROM (
    SELECT 
       history.partnumber, 
       history.datetime, 
       history.price, 
       history.quantity, 
       (
            SELECT TOP 1 price 
            FROM   history AS History1 
            WHERE  History1.datetime < history.datetime 
                   AND History1.partnumber = history.partnumber 
            ORDER  BY History1.datetime DESC
        ) AS PreviousPrice
    FROM   history 
)t
ORDER  BY t.partnumber, 
          t.datetime DESC 

Я думаю, вам нужно использовать функцию coalesce, если ее нет PreviousPrice.

  SELECT t.partnumber, 
       t.datetime, 
       t.price, 
       t.quantity, 
       coalesce(t.PreviousPrice,0) as 'PreviousPrice',
       coalesce((t.previousprice - t.price),0)  AS 'PriceDiff' 
FROM (
    SELECT 
       history.partnumber, 
       history.datetime, 
       history.price, 
       history.quantity, 
       (
            SELECT TOP 1 price 
            FROM   history AS History1 
            WHERE  History1.datetime < history.datetime 
                   AND History1.partnumber = history.partnumber 
            ORDER  BY History1.datetime DESC
        ) AS PreviousPrice
    FROM   history 
)t
ORDER  BY t.partnumber, 
          t.datetime DESC 

sqlfiddle: http://sqlfiddle.com/#!18/52a7b/5

EDIT

В моем доступе этот запрос работает хорошо.

Если вы хотите добавить символ валюты в столбец PriceDiff, вы можете использовать функцию Формат .

Вы можете попробовать это.

SELECT t.*,
       abs(t.previousprice - t.price)  AS PriceDiff  
FROM (
    SELECT 
       history.partnumber, 
       history.datetime, 
       history.price, 
       history.quantity, 
       (
            SELECT TOP 1 price 
            FROM   history AS History1 
            WHERE  History1.datetime < history.datetime 
                   AND History1.partnumber = history.partnumber 
            ORDER  BY History1.datetime DESC
        ) AS PreviousPrice
    FROM   history 
)t
WHERE t.PreviousPrice is not null
ORDER  BY t.partnumber, 
          t.datetime  

Исходные данные

enter image description here

Результат запроса

enter image description here

sqlfiddle: http://sqlfiddle.com/#!18/bfddb/6

EDIT # 2

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

так что вы можете сравнить с ID столбцом, потому что это ваш PK.

вы можете использовать ID вместо datetime

 SELECT t.*,
       abs(t.previousprice - t.price)  AS PriceDiff  
FROM (
SELECT 
       history.id,
       history.partnumber, 
       history.datetime, 
       history.price, 
       history.quantity, 
       (
            SELECT TOP 1 price 
            FROM   history AS History1 
            WHERE  History1.id < history.id 
                   AND History1.partnumber = history.partnumber 
            ORDER  BY History1.id DESC
        ) AS PreviousPrice
    FROM   history 
    )t
ORDER  BY t.partnumber,t.id  

sqlfiddle: http://sqlfiddle.com/#!18/bdeb91/1

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