Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need Help in Writing VIEW in SQL Server

I have 2 tables in SQL Server, one is called PO RECEIPT table and the other is Move Order table.

I need to write a query to insert data into Receipt table which is working fine. Receipt Number will be unique in Receipt table because it is a primary key and auto increment, e.g, for Receipt number 1 I have 2000 quantity received (it is a column).

If I want to move 500 to the move and another 500 next time for same receipt number. Now I want to write a VIEW which will add up move quantity in the Move Order table grouped by Receipt Number and will minus this quantity from the quantity received column in the Receipt table.

Currently I write this view which is working fine for same Receipt Number but when we have different Receipt Number in the Move Order table it generates an error. The view is

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]

The error generated by above view is

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

like image 620
user1743118 Avatar asked Jul 09 '26 09:07

user1743118


2 Answers

Well, the error is pretty clear: your subquery (the (select sum(..) from [Move_order].... returns multiple values - and you cannot have a subquery return multiple values if you use it in the SELECT list of columns...

Most likely, you just want to the SUM([Move_Order].[Move Quantity]) for that one Move_Order you're currently looking at - so you need to change your subquery to take that into account:

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]

I also use meaningful / self-explanatory table aliases to make a query a lot more readable ....

So now, your subquery will sum up all the [Move Quantity] values from the [Move Order] table for that one [Receipt Number] that is currently being processed.

like image 54
marc_s Avatar answered Jul 12 '26 00:07

marc_s


Also in SQLServer2005+ you can use option with OVER() clause

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, I think DISTINCT keyword is excessive in this case because your values in the TotalQuantity column is differ

like image 45
Aleksandr Fedorenko Avatar answered Jul 11 '26 23:07

Aleksandr Fedorenko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!