2013-04-14 3 views
3

У меня есть 2 таблицы в SQL Server, одна называется PO RECEIPT, а другая - Move Order.Нужна помощь в написании VIEW в SQL Server

Мне нужно написать запрос для вставки данных в таблицу Receipt, которая работает нормально. Номер получателя будет уникальным в таблице Receipt, так как это первичный ключ и автоматический прирост, например, для Receipt номер 1 У меня есть 2000 количество полученных (это столбец).

Если я хочу переместить 500 на переезд и еще 500 в следующий раз за тот же номер квитанции. Теперь я хочу написать VIEW, который добавит количество перемещений в таблицу Move Order, сгруппированную по Receipt Number и минус это количество из столбца количества, полученного в таблице Receipt.

В настоящее время я пишу этот вид, который отлично работает для того же Receipt Number, но когда у нас есть разные Receipt Number в таблице Move Order, он генерирует ошибку. Мнение

select distinct 
    [5_PO_RECEIPT_TABLE_DATABASE].[Part Number], 
    [5_PO_RECEIPT_TABLE_DATABASE].[Receipt Number], 
    (select sum([Move_Order].[Move Quantity]) 
    from [Move_Order] 
    group by [Move_Order].[Receipt Number]), 
    [5_PO_RECEIPT_TABLE_DATABASE].[Quantity Received] + [Move_Order].[Move Quantity] as TotalQuantity 
from 
    [5_PO_RECEIPT_TABLE_DATABASE] 
inner join 
    [Move_Order] on [5_PO_RECEIPT_TABLE_DATABASE].[Receipt Number] = [Move_Order].[Receipt Number] 

ошибка генерируется выше зрения

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

ответ

1

Ну, ошибка довольно ясно: ваш подзапрос (в (select sum(..) from [Move_order].... возвращает несколько значений - и вы не можете иметь возвращаемый подзапрос несколько значений, если вы используете его в SELECT списке столбцов ...

Наиболее скорее всего, вы просто хотите к SUM([Move_Order].[Move Quantity]) для этого один Move_Order вы в настоящее время, глядя на - так что вы должны изменить свой подзапрос принять во внимание:

SELECT DISTINCT 
    rcpt.[Part Number], 
    rcpt.[Receipt Number], 
    (SELECT SUM(m.[Move Quantity]) 
    FROM [Move_Order] m 
    WHERE m.[Receipt Number] = rcpt.[Receipt Number]), 
    rcpt.[Quantity Received] + mo.[Move Quantity] AS TotalQuantity 
FROM 
    [5_PO_RECEIPT_TABLE_DATABASE] rcpt 
INNER JOIN 
    [Move_Order] mo ON rcpt.[Receipt Number] = mo.[Receipt Number] 

Я также использую смысл/пояснений псевдонимов таблиц сделать запрос намного более читаемым ....

Итак, ваш подзапрос будет суммировать все [Move Quantity] значения из [Move Order] таблицы для этого одного [Receipt Number], что в настоящее время обрабатывается.

1

Также в SQLServer2005 + вы можете использовать опцию с OVER() п

SELECT DISTINCT 
     rcpt.[Part Number], 
     rcpt.[Receipt Number], 
     SUM(mo.[Move Quantity]) OVER(PARTITION BY rcpt.[Receipt Number]), 
     rcpt.[Quantity Received] + mo.[Move Quantity] AS TotalQuantity 
FROM [5_PO_RECEIPT_TABLE_DATABASE] rcpt 
    INNER JOIN [Move_Order] mo ON rcpt.[Receipt Number] = mo.[Receipt Number] 

BTW, я думаю, что DISTINCT ключевое слово избыточна в данном случае, потому что ваши значения в столбце TotalQuantity будет отличаться

Смежные вопросы