2014-10-04 2 views
1

Для проекта я хочу создать прейскурант. Я хочу получить только последние цены от каждого поставщика за каждую статью.SQL выберите только самую высокую дату

Есть только эти две таблицы.

Table articles 

ARTNR | TXT   | ACTIVE | SUPPLIER 
------------------------------------------ 
10  | APPLE   | Y   | 10 
20  | ORANGE  | Y   | 10 
30  | KEYBOARD  | N   | 20 
40  | ORANGE  | Y   | 20 
50  | BANANA  | Y   | 10 
60  | CHERRY  | Y   | 10 


Table prices 
ARTNR | PRCGRP | PRCDAT | PRICE 
-------------------------------------- 
10  | 10  | 01-Aug-10 | 2.1 
10  | 10  | 05-Aug-11 | 2.2 
10  | 10  | 21-Aug-12 | 2.5 
20  | 0   | 01-Aug-10 | 2.1 
20  | 10  | 09-Aug-12 | 2.3 
10  | 10  | 14-Aug-13 | 2.7 

Это то, что я до сих пор:

SELECT 
    ARTICLES.[ARTNR], ARTICLES.[TXT], ARTICLES.[ACTIVE], ARTICLES.[SUPPLIER], PRICES.PRCGRP, PRICES.PRCDAT, PRICES.PRICE 
FROM 
    ARTICLES INNER JOIN PRICES ON ARTICLES.ARTNR = PRICES.ARTNR 
WHERE 
    (
    (ARTICLES.[ACTIVE]="Y") AND 
    (ARTICLES.[SUPPLIER]=10) AND 
    (PRICES.PRCGRP=0) AND 
    (PRICES.PRCDAT=(SELECT MAX(PRCDAT) FROM PRICES as art WHERE art.ARTNR =  PRICES.artnr)) 
    ) 
ORDER BY ARTICLES.ARTNR 
; 

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

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

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

Что не так?

+0

Изменить 'WHERE art.ARTNR = PRICES.artnr' to' WHERE art.ARTNR = ARTICLES.artnr' – Mihai

+0

@Mihai Спасибо за ваш комментарий. Пробовал это, но имел тот же результат с отсутствующими статьями. –

+0

Один простой способ - повторить условия WHERE в подзапросе. – Mihai

ответ

2

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

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

SELECT a.artnr, a.txt, a.active, a.supplier, p.prcgrp, p.prcdat, p.price 
FROM articles a INNER JOIN prices p ON a.ARTNR = p.ARTNR 
JOIN (
    SELECT a.artnr, MAX(p.prcdat) prcdat 
    FROM articles a JOIN prices p ON a.artnr = p.artnr 
    WHERE a.active='Y' AND a.supplier=10 AND p.prcgrp=10 
    GROUP BY a.artnr) z 
ON a.artnr = z.artnr AND p.prcdat = z.prcdat 
ORDER BY a.ARTNR 

Если поддержка SQL в доступе не позволит присоединиться к подзапрос, вы можете просто перенести условия внутри существующего подзапроса, что-то подобное;

SELECT a.artnr, a.txt, a.active, a.supplier, p.prcgrp, p.prcdat, p.price 
FROM articles a INNER JOIN prices p ON a.ARTNR = p.ARTNR 
WHERE p.prcdat = (
    SELECT MAX(p2.prcdat) 
    FROM articles a2 JOIN prices p2 ON a2.artnr = p2.artnr 
    WHERE a.artnr = a2.artnr AND a2.active='Y' AND a2.supplier=10 AND p2.prcgrp=10 
) 
ORDER BY a.ARTNR; 

Обратите внимание, что из-за ограничения в определении уникальной цены (без первичного ключа в ценах), запросы могут давать дубликаты, если несколько цен на одной и те же статьи, имеют один и тот же prcdat. Если это проблема, вам, вероятно, придется дублировать ваши условия вне подзапроса.

+0

Вы правы. Я пропустил путь, чтобы получить самую последнюю цену за то, что я хочу. С вашим запросом я получаю ошибку «пропавшего оператора» для части после того, как a.artnr = p.artnr join ... –

+0

@MareInfinitus Добавлена ​​альтернатива с регулярным подзапросом. –

+0

Большое спасибо. Прямо сейчас у меня есть синтаксическая ошибка в части подзапроса, начиная с «p.prcdat =». Но все это выглядит как совершенно законный SQL. Мне не очень нравится доступ ... –

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