SQL Server: сложный запрос

У меня есть две таблицы document и documentd; первый содержит номера счетов doc_num в качестве первичного ключа, типы документов doc_type (FACA, BLCO, BLCM, BLCK .....) и дату документа doc_date.

Каждый счет имеет один DOC_TYPE и одну дату, и каждая дата может содержаться в одном или нескольких счетах.

Таблица DOCUMENT:

DOC_NUM DOC_TYPE DOC_DATE СЧЕТ1901221 ФАЦА 01.02.2019 СЧЕТ1902221 ФАЦА 22.02.2019 СЧЕТ1902222 ФАЦА 22.02.2019 СЧЕТ1903221 ФАЦА 22.03.2019 БЛКО190122001 БЛКО 01.02.2019 БЛКО190123001 БЛКО 23.01.2019 БЛКМ190122001 БЛСМ 01.02.2019 СЧЕТ1901021 ФАЦА 01.02.2019 СЧЕТ1903011 ФАЦА 03.01.2019 СЧЕТ1904221 ФАЦА 22.04.2019 СЧЕТ1904222 ФАЦА 22.04.2019

Вторая таблица содержит сведения о каждом счете-фактуре, который он содержит в качестве внешнего ключа doc_num, код продуктов для каждого счета-фактуры art_code и, наконец, цены на продукты art_price.

Таблица DOCUMENTD:

DOC_NUM ART_CODE ART_PRICE СЧЕТ1901221 ПРОДУКТ1 1000 СЧЕТ1901221 ПРОДУКТ2 2000 г. СЧЕТ1902221 ПРОДУКТ3 950 СЧЕТ1902221 ПРОДУКТ4 980 СЧЕТ1904221 ПРОДУКТ1 1200 СЧЕТ1903011 ПРОДУКТ2 900 БЛКО190122001 СТАТЬЯ 1 900 БЛКО190123001 СТАТЬЯ 2 800

[ДОКУМЕНТИРОВАННАЯ ТАБЛИЦА][2]

Моя цель на первом этапе — соединить две таблицы, используя doc_num, чтобы выбрать все счета-фактуры FACA и их продукты, кроме цен, которые должны быть ПОСЛЕДНИМИ ОБНОВЛЕННЫМИ ЦЕНАМИ В ТИПЕ FACA.

РЕЗУЛЬТАТ:

СЧЕТ1904221 ПРОДУКТ1 1200 22.04.2019 СЧЕТ1903011 ПРОДУКТ2 900 03.01.2019 СЧЕТ1902221 ПРОДУКТ3 950 22.02.2019 СЧЕТ1902221 ПРОДУКТ4 980 22.02.2019

На втором этапе у меня есть другая таблица, содержащая ORDER и ART_CODE:

ЗАКАЗ ART_CODE 1 ПРОДУКТ1 2 ПРОДУКТ2 3 ПРОДУКТ3

Я хочу получить первый результат, зависящий от этой таблицы:

СЧЕТ1904221 ПРОДУКТ1 1200 22.04.2019 СЧЕТ1903011 ПРОДУКТ2 900 03.01.2019 СЧЕТ1902221 ПРОДУКТ3 950 22.02.2019

Я пробую это, но он приносит один и тот же товар по разным ценам.

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'

Я не понимаю ...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, что это значит? Для чего этот стол? Вы не присоединяетесь к нему.

Sebastian S. 15.02.2023 17:21

Я хочу выбрать из таблицы DOCUMENTD продукты с последней ценой, зависящей от самой новой даты из таблицы DOCUMENT и с DOC_TYPE FACA, и показать только продукты, которые существовали в последней таблице.

MOHAMED NEJI 16.02.2023 08:29
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@МОХАМЕД НЕДЖИ, очень сложно понять, что ты имел в виду. Пожалуйста, постарайтесь быть более четкими в своих вопросах. Предлагаемое ниже решение показывает, как получить запрошенные вами результаты в обеих таблицах 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

Другие вопросы по теме