SQL SERVER - сложный SQL-запрос 2 - PullRequest
0 голосов
/ 23 октября 2019

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

МНОГИЕ ДОКУМЕНТЫ РАЗЛИЧНЫЕ ДАТЫ И РАЗЛИЧНЫЕ ВИДЫ

Таблица ДОКУМЕНТ :

|    DOC_NUM       | DOC_TYPE |   DOC_DATE  |
|                  |          |             |
|  ACHAT190122001  |   FACA   |  22/01/2019 |  
|  ACHAT190222001  |   FACA   |  22/02/2019 |
|  ACHAT190322001  |   FACA   |  22/03/2019 |
|  BLCO190122001   |   BLCO   |  22/01/2019 |
|  BLCO190123001   |   BLCO   |  23/01/2019 |
|  BLCM190122001   |   BLCM   |  22/01/2019 |
|  ACHAT190102010  |   FACA   |  02/01/2019 |
|  ACHAT190103011  |   FACA   |  03/01/2019 |
|  ACHAT190422005  |   FACA   |  22/04/2019 |

ТАБЛИЦА ДОКУМЕНТОВ

Вторая таблица содержит в качестве внешнего ключа ' doc_num 'статьи каждого документа' art_code 'и, наконец, цены на статьи' art_prix '.

ДЕТАЛИ КАЖДОГО ДОКУМЕНТА В ДОКУМЕНТЕТАБЛИЦА С РАЗНЫМИ И ЖЕ СТАТЬЯМИ И ЦЕНАМИ.

Таблица ДОКУМЕНТ :

|     DOC_NUM      |  ART_CODE |ART_PRIX |
|                  |           |         |
|  ACHAT190122001  |  ARTICLE1 |  1000   |
|  ACHAT190122001  |  ARTICLE2 |  2000   |
|  ACHAT190102010  |  ARTICLE1 |   950   |
|  ACHAT190103011  |  ARTICLE1 |   980   |
|  ACHAT190422005  |  ARTICLE2 |  1200   |
|  ACHAT190120006  |  ARTICLE2 |  1000   |
|  BLCO190122001   |  ARTICLE1 |   900   |
|  BLCO190123001   |  ARTICLE2 |   800   |

ТАБЛИЦА ДОКУМЕНТОВ

Моя цель - объединить две таблицы, используя ' doc_num ', чтобы выбрать все документы типа BLC и их статьи , за исключением цен, которые должны быть THE ПОСЛЕДНЯЯ ОБНОВЛЕННАЯ ЦЕНА В ТИПЕ FCAC НА ПРИМЕРЕ

РЕЗУЛЬТАТ:

| BLCO190122001 |  ARTICLE1 | 1000 |  22/01/2019 |
| BLCO190123001 |  ARTICLE2 | 1200 |  22/04/2019 |

РЕЗУЛЬТАТ

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

На мой взгляд, вы хотите объединить все документы типа FACA со всеми документами BLC? в столбце ART_CODE.

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

  1. Создать представление для всех документов типа FACA ...
create view FACAS as
select DOCUMENTD.DOC_NUM, DOCUMENTD.ART_CODE, DOCUMENTD.ART_PRIX, DOCUMENT.DOC_DATE
from DOCUMENTD join DOCUMENT on DOCUMENTD.DOC_NUM = DOCUMENT.DOC_NUM
where DOCUMENT.DOC_TYPE = 'FACA'
Создать другое представление для всех документов типа BLC? ...
create view BLC_S as
select DOCUMENTD.DOC_NUM, DOCUMENTD.ART_CODE, DOCUMENTD.ART_PRIX, DOCUMENT.DOC_DATE
from DOCUMENTD join DOCUMENT on DOCUMENTD.DOC_NUM = DOCUMENT.DOC_NUM
where DOCUMENT.DOC_TYPE like 'BLC%'

Теперь запросить оба представления, объединяя столбец ART_CODE ...

select BLC_S.DOC_NUM, BLC_S.ART_CODE, FACAS.ART_PRIX, BLC_S.DOC_DATE
from FACAS join BLC_S on FACAS.ART_CODE = BLC_S.ART_CODE
0 голосов
/ 23 октября 2019

Вот один из способов:

DECLARE @document table (
    DOC_NUM VARCHAR(MAX)
    ,DOC_TYPE VARCHAR(MAX)
    ,DOC_DATE VARCHAR(MAX)
)

INSERT INTO @document VALUES
    ('ACHAT190122001', 'FACA', '22/01/2019')
    , ('ACHAT190222001', 'FACA', '22/02/2019')
    , ('ACHAT190322001', 'FACA', '22/03/2019')
    , ('BLCO190122001', 'BLCO', '22/01/2019')
    , ('BLCO190123001', 'BLCO', '23/01/2019')
    , ('BLCM190122001', 'BLCM', '22/01/2019')

DECLARE @documentd TABLE (
    DOC_NUM VARCHAR(MAX)
    ,ART_CODE VARCHAR(MAX)
    ,ART_PRIX SMALLMONEY
)

INSERT INTO @documentd VALUES
    ('ACHAT190122001', 'ARTICLE1', 1000)
    ,('ACHAT190122001', 'ARTICLE2', 2000)
    ,('BLCO190122001', 'ARTICLE1',  900)
    ,('BLCO190123001', 'ARTICLE2',  800)

SELECT d1.DOC_NUM, dd1.ART_CODE, dd2.ART_PRIX, 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 = 'BLCO'

Возвращает:

DOC_NUM         ART_CODE    ART_PRIX    DOC_DATE
BLCO190122001   ARTICLE1    1000.00     22/01/2019
BLCO190122001   ARTICLE2    2000.00     22/01/2019

Из результатов вашего примера я предположил, что вам нужны только документы BLCO, а не BLCM. Если вы хотите оба, просто измените последнюю строку на:

WHERE d.DOC_TYPE LIKE 'BLC%' AND d2.DOC_TYPE = 'FACA'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...