mcarpenter
mcarpenter

Reputation: 47

Calculating sum of 'total' from orders table for specific store when storeID stored in either orders or customers table

Here's the scenario: I've got an orders table and a customers table. I'd like to calculate the SUM of the column total for specific storeID. The problem is that my company used to store the storeID in the customers table but now it's being stored in the orders table. There are orders in our database where the storeID is only set in the customers table, only set in the orders table, or set in both tables.

Here's some schema example data for reference:

Table Orders:

+----+-------+------------+---------+
| id | total | customerID | storeID |
+----+-------+------------+---------+
|  0 |   100 |          1 | 1       |
|  1 |    50 |          1 | NULL    |
|  2 |    75 |          1 | 1       |
+----+-------+------------+---------+

Table Customers:

+----+----------+
| id | storeID  |
+----+----------+
|  1 | 1 | NULL |
+----+----------+

The query I've been playing around with trying to calculate the sum of the order total looks like this:

SELECT SUM(total)
FROM orders o
INNER JOIN customers c
        ON c.ID = o.customerID
WHERE ISNULL(c.storeID,o.storeID) = @storeID

This query works, but it's super slow because we have so many order records in our database. Is there a more efficient way to do this? I'm using SQL Server 2008 R2.

Thanks, Matt

Upvotes: 2

Views: 1572

Answers (1)

Clodoaldo Neto
Clodoaldo Neto

Reputation: 125444

SELECT SUM(total)
FROM orders o
WHERE coalesce(o.storeID, (
                    select storeID
                    from customers
                    where id = o.customerID
                ) = @storeID

BTW you can just update the orders table and after that query from there only:

update orders o
set storeID = (
        select storeID
        from customers
        where id = o.customerID
        )
where storeID is null

Upvotes: 1

Related Questions