Структура таблицы:
#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 таблицы? (Я пытаюсь создать процедуру для получения результата. Так что, если создавать временные таблицы проще, я тоже могу это сделать)
Пожалуйста, дайте минимальный воспроизводимый пример. Покажите, какие запросы для частей этого кода вы можете выполнять правильно, включая большую часть этого кода, которая работает правильно. Также ваши описания того, что вы хотите (включая резюме), неясны. Используйте достаточно слов, предложений и ссылок на примеры (включая правильные небольшие запросы), чтобы объяснить, что вы имеете в виду.
Примеры данных, желаемые результаты и объяснение логики помогут.
Я получил сообщение об ошибке: «Столбец '#IN.QUANTITY' недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY».
• Это сообщение об ошибке часто задаваемые вопросы. И прочитайте, как использовать group by. Прежде чем рассматривать публикацию, пожалуйста, всегда гуглите много четких, кратких и точных формулировок вашего вопроса/проблемы/цели и/или сообщения об ошибке, с вашими конкретными строками/именами и без них, и читайте много ответов. Если вы публикуете вопрос, используйте одну фразу в качестве заголовка. • Где ваш запрос? Дампы требований - это не вопросы по теме. См. Как спросить и тексты при наведении указателя мыши на стрелку голосования. • Уточняйте посредством правок, а не комментариев. • Google «уведомления stackexchange», чтобы научиться использовать @x, чтобы уведомлять одного не-постера, не единственного комментатора x о комментарии.
Почему новое сообщение об ошибке непонятно? Подзапрос содержит >1 строку. В любом случае это также faq. Чтение скалярных подзапросов. Покажите рабочую часть этого кода. PS Пожалуйста, не редактируйте сообщение с вопросом таким образом, чтобы сделать недействительными сообщения с разумными ответами. Исправьте старый пост, чтобы задать свой вопрос, и опубликуйте новый вопрос. Пожалуйста, задавайте по одному вопросу в каждом посте. Не смешивайте вопрос о вашем сообщении об ошибке с вопросом о вашей общей цели. PS Узнайте, что возвращает левое/правое соединение при возврате: внутреннее соединение строк плюс несопоставленные левые/правые строки таблицы, расширенные нулями. Всегда знайте, какое внутреннее соединение вы хотите использовать как часть внешнего соединения.
я все равно решил это извините за путаницу тогда


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