У меня есть две таблицы document и documentd; первый содержит номера счетов doc_num в качестве первичного ключа, типы документов doc_type (FACA, BLCO, BLCM, BLCK .....) и дату документа doc_date.
Каждый счет имеет один DOC_TYPE и одну дату, и каждая дата может содержаться в одном или нескольких счетах.
Таблица DOCUMENT:
Вторая таблица содержит сведения о каждом счете-фактуре, который он содержит в качестве внешнего ключа doc_num, код продуктов для каждого счета-фактуры art_code и, наконец, цены на продукты art_price.
Таблица DOCUMENTD:
[ДОКУМЕНТИРОВАННАЯ ТАБЛИЦА][2]
Моя цель на первом этапе — соединить две таблицы, используя doc_num, чтобы выбрать все счета-фактуры FACA и их продукты, кроме цен, которые должны быть ПОСЛЕДНИМИ ОБНОВЛЕННЫМИ ЦЕНАМИ В ТИПЕ FACA.
РЕЗУЛЬТАТ:
На втором этапе у меня есть другая таблица, содержащая ORDER и ART_CODE:
Я хочу получить первый результат, зависящий от этой таблицы:
Я пробую это, но он приносит один и тот же товар по разным ценам.
SELECT
d1.DOC_NUM, dd1.ART_CODE, dd2.ART_PRICE, d2.DOC_DATE
FROM
document d1
INNER JOIN
documentd dd1 ON dd1.DOC_NUM = d1.DOC_NUM
INNER JOIN
documentd dd2 ON dd2.ART_CODE = dd1.ART_CODE
INNER JOIN
document d2 ON d2.DOC_NUM = dd2.DOC_NUM
AND d2.DOC_TYPE <> d1.DOC_TYPE
WHERE
d1.DOC_TYPE = 'FACA'
Я хочу выбрать из таблицы DOCUMENTD продукты с последней ценой, зависящей от самой новой даты из таблицы DOCUMENT и с DOC_TYPE FACA, и показать только продукты, которые существовали в последней таблице.
@МОХАМЕД НЕДЖИ, очень сложно понять, что ты имел в виду. Пожалуйста, постарайтесь быть более четкими в своих вопросах. Предлагаемое ниже решение показывает, как получить запрошенные вами результаты в обеих таблицах RESULTS с предоставленными вами входными данными.
CREATE TABLE #DOCUMENT (
DOC_NUM VARCHAR(30)
, DOC_TYPE CHAR(4)
, DOC_DATE DATE)
CREATE TABLE #DOCUMENTD (
DOC_NUM VARCHAR(30)
, ART_CODE VARCHAR(20)
, ART_PRICE DECIMAL(10,4))
CREATE TABLE #OTHERTABLE(
[ORDER] int
, ART_CODE VARCHAR(20)
)
INSERT INTO #DOCUMENT
SELECT 'INVOICE1901221' DOC_NUM, 'FACA' DOC_TYPE, '2019-01-22' DOC_DATE
UNION ALL SELECT 'INVOICE1902221' DOC_NUM, 'FACA' DOC_TYPE, '2019-02-22' DOC_DATE
UNION ALL SELECT 'INVOICE1902222' DOC_NUM, 'FACA' DOC_TYPE, '2019-02-22' DOC_DATE
UNION ALL SELECT 'INVOICE1903221' DOC_NUM, 'FACA' DOC_TYPE, '2019-03-22' DOC_DATE
UNION ALL SELECT 'BLCO190122001' DOC_NUM, 'BLCO' DOC_TYPE, '2019-01-22' DOC_DATE
UNION ALL SELECT 'BLCO190123001' DOC_NUM, 'BLCO' DOC_TYPE, '2019-01-23' DOC_DATE
UNION ALL SELECT 'BLCM190122001' DOC_NUM, 'BLCM' DOC_TYPE, '2019-01-22' DOC_DATE
UNION ALL SELECT 'INVOICE1901021' DOC_NUM, 'FACA' DOC_TYPE, '2019-01-02' DOC_DATE
UNION ALL SELECT 'INVOICE1903011' DOC_NUM, 'FACA' DOC_TYPE, '2019-03-01' DOC_DATE
UNION ALL SELECT 'INVOICE1904221' DOC_NUM, 'FACA' DOC_TYPE, '2019-04-22' DOC_DATE
UNION ALL SELECT 'INVOICE1904222' DOC_NUM, 'FACA' DOC_TYPE, '2019-04-22' DOC_DATE
INSERT INTO #DOCUMENTD
SELECT 'INVOICE1901221' DOC_NUM, 'PRODUCT1' ART_CODE, 1000 ATR_PRICE
UNION ALL SELECT 'INVOICE1901221' DOC_NUM, 'PRODUCT2' ART_CODE, 2000 ATR_PRICE
UNION ALL SELECT 'INVOICE1902221' DOC_NUM, 'PRODUCT3' ART_CODE, 950 ATR_PRICE
UNION ALL SELECT 'INVOICE1902221' DOC_NUM, 'PRODUCT4' ART_CODE, 980 ATR_PRICE
UNION ALL SELECT 'INVOICE1904221' DOC_NUM, 'PRODUCT1' ART_CODE, 1200 ATR_PRICE
UNION ALL SELECT 'INVOICE1903011' DOC_NUM, 'PRODUCT2' ART_CODE, 900 ATR_PRICE
UNION ALL SELECT 'BLCO190122001' DOC_NUM, 'ARTICLE1' ART_CODE, 900 ATR_PRICE
UNION ALL SELECT 'BLCO190123001' DOC_NUM, 'ARTICLE2' ART_CODE, 800 ATR_PRICE
INSERT INTO #OTHERTABLE
SELECT 1 [ORDER], 'PRODUCT1' ART_CODE
UNION ALL SELECT 2 [ORDER], 'PRODUCT2' ART_CODE
UNION ALL SELECT 3 [ORDER], 'PRODUCT3' ART_CODE
;WITH Docs AS (
SELECT dd.DOC_NUM, dd.ART_CODE, dd.ART_PRICE, d.DOC_DATE ,ROW_NUMBER() OVER (PARTITION BY art_code ORDER BY DOC_DATE DESC ) rn
FROM #DOCUMENTD dd
INNER JOIN #DOCUMENT d
ON d.DOC_NUM = dd.DOC_NUM
WHERE DOC_TYPE = 'FACA'
)
SELECT DOC_NUM, ART_CODE, ART_PRICE, DOC_DATE
FROM Docs
WHERE rn = 1
;WITH Docs AS (
SELECT dd.DOC_NUM, dd.ART_CODE, dd.ART_PRICE, d.DOC_DATE ,ROW_NUMBER() OVER (PARTITION BY art_code ORDER BY DOC_DATE DESC ) rn
FROM #DOCUMENTD dd
INNER JOIN #DOCUMENT d
ON d.DOC_NUM = dd.DOC_NUM
WHERE DOC_TYPE = 'FACA'
)
SELECT DOC_NUM, Docs.ART_CODE, ART_PRICE, DOC_DATE
FROM Docs
INNER JOIN #OTHERTABLE ot
ON ot.ART_CODE = Docs.ART_CODE
WHERE rn = 1
Я не понимаю ...except the prices they must be THE LAST UPDATED PRICE IN FACA TYPE. Что ты имеешь в виду? Кроме того, я не понимаю смысла этого: The second step I have another table how contain ORDER and ART_CODE, что это значит? Для чего этот стол? Вы не присоединяетесь к нему.