SQL Server: ВЫБЕРИТЕ соединение - PullRequest
0 голосов
/ 15 марта 2019

Структура таблицы:

#IN
(
    REFNUM NVARCHAR(5),
    QUANTITY INT,
    BIRTH DATE,
    WH NVARCHAR(10),
    BIN NVARCHAR(10),
    WEEK INT,
    DAY INT
)

#OUT 
(
    REFNUM NVARCHAR(5),
    QUANTITY INT,
    BIRTH DATE,
    WH NVARCHAR(10),
    BIN NVARCHAR(10),
    WEEK INT,
    DAY INT
)

#TRANSFER 
(
    REFNUM NVARCHAR(5),
    QUANTITY INT,
    BIRTH DATE,
    WH NVARCHAR(10),
    BIN NVARCHAR(10),
    OUTWH NVARCHAR(10),
    INBIN NVARCHAR(10),
    WEEK INT,
    DAY INT 
)



(Insert test data)
Insert into #IN (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0001', 100, '2019.01.29', 'A01', 'A01')
Insert into #IN (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0002', 100, '2019.01.29', 'A01', 'A02')
Insert into #IN (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0003', 100, '2019.01.29', 'A01', 'A03')
Insert into #IN (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0004', 100, '2019.01.29', 'A01', 'A04')

Insert into #OUT (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0001', 10, '2019.01.29', 'A01', 'A01')
Insert into #OUT (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0001', 10, '2019.01.29', 'A01', 'A01')
Insert into #OUT (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0002', 10, '2019.01.29', 'A01', 'A02')
Insert into #OUT (REFNUM, QUANTITY, BIRTH, WH, BIN) VALUES ('0002', 10, '2019.01.29', 'A01', 'A02')

Insert into #TRANSFER (REFNUM, QUANTITY, BIRTH, WH, BIN, INWH, INBIN) VALUES ('0001', 10, '2019.01.29', 'A01', 'A01', 'A01', 'A03')
Insert into #TRANSFER (REFNUM, QUANTITY, BIRTH, WH, BIN, INWH, INBIN) VALUES ('0001', 10, '2019.01.29', 'A01', 'A01', 'A01', 'A03')
Insert into #TRANSFER (REFNUM, QUANTITY, BIRTH, WH, BIN, INWH, INBIN) VALUES ('0001', 10, '2019.01.29', 'A01', 'A02', 'A01', 'A04')
Insert into #TRANSFER (REFNUM, QUANTITY, BIRTH, WH, BIN, INWH, INBIN) VALUES ('0001', 10, '2019.01.29', 'A01', 'A02', 'A01', 'A04')

результат, который я хотел бы получить:

REFNUM QUANTITY WH  BIN
0001   80       A01 A01
0001   120      A01 A03
0002   80       A01 A02
0002   120      A01 A04 

и запрос, который я получил до сих пор:

SELECT 
I.REFNUM,
I.WH,
I.BIN,
O.WH,
O.BIN,
T.WH,
T.BIN,
T.REFNUM,
(SELECT QUANTITY FROM #IN I) - ISNULL((SELECT SUM(QUANTITY) FROM #OUT O),0) -   ISNULL((SELECT SUM(QUANTITY) FROM #TRANSFER T), 0) AS RESULT 
FROM #IN I 
RIGHT OUTER JOIN #OUT O 
ON I.REFNUM = O.REFNUM 
RIGHT OUTER JOIN #TRANSFER T
ON O.REFNUM = T.REFNUM 
GROUP BY I.REFNUM, O.REFNUM, T.REFNUM, I.WH, I.BIN, O.WH, O.BIN, T.WH, 
T.BIN
ORDER BY I.REFNUM

и я получаю сообщение об ошибке: «Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения."

Каким должен быть мой запрос, чтобы получить желаемый результат, соединив эти 3 таблицы?(Я пытаюсь создать процедуру для получения результата. Поэтому, если проще создать временные таблицы, я тоже могу это сделать)

1 Ответ

0 голосов
/ 15 марта 2019

Поскольку ваши таблицы #out & #transfer имеют повторяющиеся значения ... вы можете попробовать что-то вроде этого

WITH CTE_OUT
AS (
    SELECT REFNUM
        ,SUM(QUANTITY) AS QUANTITY --.... OTHERCOLUMNS 
    FROM #OUT
    GROUP BY REFNUM
    )
    ,CTE_TRANSFER
AS (
    SELECT REFNUM
        ,SUM(QUANTITY) AS QUANTITY --.... OTHERCOLUMNS 
    FROM #TRANSFER
    GROUP BY REFNUM
    )
SELECT O.REFNUM
    ,ISNULL(I.QUANTITY, 0) - ISNULL(O.QUANTITY, 0) - ISNULL(T.QUANTITY, 0) AS QUANTITY -- WHAT EVER IS YOUR EXPRESSION 
FROM #IN I
LEFT JOIN CTE_OUT O ON I.REFNUM = O.REFNUM
LEFT JOIN CTE_TRANSFER T ON O.REFNUM = T.REFNUM
GROUP BY O.REFNUM -- OTHER COLUMNS 
...