SQL Server: ВЫБЕРИТЕ присоединиться

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

#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 таблицы? (Я пытаюсь создать процедуру для получения результата. Так что, если создавать временные таблицы проще, я тоже могу это сделать)

КАКИЕ это ошибка?? Помните: мы не можем видеть и читать ваш экран, и мы не можем читать ваши мысли (пока что) — вам придется скажи нам и показать ошибку, которая произошла!
marc_s 15.03.2019 10:56

Пожалуйста, дайте минимальный воспроизводимый пример. Покажите, какие запросы для частей этого кода вы можете выполнять правильно, включая большую часть этого кода, которая работает правильно. Также ваши описания того, что вы хотите (включая резюме), неясны. Используйте достаточно слов, предложений и ссылок на примеры (включая правильные небольшие запросы), чтобы объяснить, что вы имеете в виду.

philipxy 15.03.2019 11:56

Примеры данных, желаемые результаты и объяснение логики помогут.

Gordon Linoff 15.03.2019 12:04

Я получил сообщение об ошибке: «Столбец '#IN.QUANTITY' недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY».

Christine Jang 16.03.2019 12:03

• Это сообщение об ошибке часто задаваемые вопросы. И прочитайте, как использовать group by. Прежде чем рассматривать публикацию, пожалуйста, всегда гуглите много четких, кратких и точных формулировок вашего вопроса/проблемы/цели и/или сообщения об ошибке, с вашими конкретными строками/именами и без них, и читайте много ответов. Если вы публикуете вопрос, используйте одну фразу в качестве заголовка. • Где ваш запрос? Дампы требований - это не вопросы по теме. См. Как спросить и тексты при наведении указателя мыши на стрелку голосования. • Уточняйте посредством правок, а не комментариев. • Google «уведомления stackexchange», чтобы научиться использовать @x, чтобы уведомлять одного не-постера, не единственного комментатора x о комментарии.

philipxy 17.03.2019 08:18

Почему новое сообщение об ошибке непонятно? Подзапрос содержит >1 строку. В любом случае это также faq. Чтение скалярных подзапросов. Покажите рабочую часть этого кода. PS Пожалуйста, не редактируйте сообщение с вопросом таким образом, чтобы сделать недействительными сообщения с разумными ответами. Исправьте старый пост, чтобы задать свой вопрос, и опубликуйте новый вопрос. Пожалуйста, задавайте по одному вопросу в каждом посте. Не смешивайте вопрос о вашем сообщении об ошибке с вопросом о вашей общей цели. PS Узнайте, что возвращает левое/правое соединение при возврате: внутреннее соединение строк плюс несопоставленные левые/правые строки таблицы, расширенные нулями. Всегда знайте, какое внутреннее соединение вы хотите использовать как часть внешнего соединения.

philipxy 18.03.2019 02:38

я все равно решил это извините за путаницу тогда

Christine Jang 18.03.2019 09:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
7
64
1

Ответы 1

Поскольку ваши таблицы #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 

Я получаю сообщение об ошибке: "Столбец "#OUT.WEEK" недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY".

Christine Jang 16.03.2019 16:14

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