Search code examples
t-sqlcorrelated-subquery

How to correlate update with select query


I want to update every row in the column SalesDifference20132015 in the table Stockitems based on the values in different columns in the same table. I know the SELECT query work however when I plug it into my update query I get the subquery returned more than 1 value error. How do i correlate my select query with my update?

UPDATE warehouse.StockItems
    SET SalesDifference20132015 =
    (SELECT (SELECT COUNT(*)
    FROM Sales.Orders o
    join sales.OrderLines ol ON o.OrderID = ol.OrderID
    WHERE ol.StockItemID = si.StockItemID AND YEAR(o.OrderDate) = 2013
    Group by ol.StockItemID)
    -
    (SELECT COUNT(*)
    FROM Sales.Orders o
    join sales.OrderLines ol ON o.OrderID = ol.OrderID
    WHERE ol.StockItemID = si.StockItemID AND YEAR(o.OrderDate) = 2015
    Group by ol.StockItemID)

    FROM Warehouse.StockItems si
    )

Solution

  • Something like this should work:

    UPDATE si
    SET SalesDifference20132015 = DIFF.Diff
    FROM
        warehouse.StockItems si
        JOIN
            (
                SELECT DISTINCT
                    StockItemID
                    ,
                        (
                            SELECT COUNT(*)
                            FROM
                                Sales.Orders o
                                JOIN sales.OrderLines ol ON o.OrderID = ol.OrderID
                            WHERE ol.StockItemID = si.StockItemID AND YEAR(o.OrderDate) = 2013
                            GROUP BY ol.StockItemID
                        )
                            -
                        (
                            SELECT COUNT(*)
                            FROM
                                Sales.Orders o
                                JOIN sales.OrderLines ol ON o.OrderID = ol.OrderID
                            WHERE ol.StockItemID = si.StockItemID AND YEAR(o.OrderDate) = 2015
                            GROUP BY ol.StockItemID
                        ) Diff
                FROM Warehouse.StockItems si
            ) DIFF
        ON si.StockItemID = DIFF.StockItemID