<p>Alright. I have a query that looks like this:</p>

<pre><code>SELECT
    SUM(`order_items`.`quantity`) as `count`,
    `menu_items`.`name`
FROM 
    `orders`,
    `menu_items`,
    `order_items` 
WHERE 
    `orders`.`id` = `order_items`.`order_id` AND 
    `menu_items`.`id` = `order_items`.`menu_item_id` AND 
    `orders`.`date` &gt;= '2008-11-01' AND 
    `orders`.`date` &lt;= '2008-11-30' 
GROUP BY 
    `menu_items`.`id`
</code></pre>

<p>The purpose of this query is to show the amount of items sold in a given date range. Although this works, I now need it to show a <code>count</code> of <code>0</code> if a particular item has no sales in the date range. I tried using <code>COALESCE</code> around the <code>SUM</code> but that didn't do the trick, and I didn't really expect it to. Anyhow, does anyone know how I would go about accomplishing this? I'm having one of those moments where I feel like I should know this but I can't think of it.</p>

<p>Cheers</p>

Randy's answer is close, but the where statement removes any mention of those items not part of any orders in that date range.
Note that "left join" is different to linking tables in the where clause in the manner you have done (i.e. inner joins). I suggest you read up on the different types of SQL joins (inner, outer, cross).
In essense, you need to join the data you get from Randy's query against your source list of items. Using a subselect will do this:
```
```
SELECT
    name
    , nvl(count, 0) as count
FROM 
    menu_items items 
    LEFT JOIN (
        SELECT
            menu_items.id
            , SUM(order_items.quantity) as count
        FROM 
            menu_items
            LEFT JOIN order_items ON menu_items.id = order_items.menu_item_id
            LEFT JOIN orders ON orders.id = order_items.order_id
        WHERE
            "date" between to_date('2008-11-01','YYYY-MM-DD') and to_date('2008-11-30','YYYY-MM-DD')
        GROUP BY
            menu_items.id
    ) counts on items.id = counts.id;
```
```
This is in Oracle 10g BTW. I doubt you're using Oracle, so you'll need to convert to your own database.
Running a test shows the following:
```
```
SQL> create table menu_items ( id number, name varchar2(10));
create table order_items (order_id number, menu_item_id number, quantity number);
create table orders (id number, "date" date);

Table created.

SQL> 
Table created.

SQL> 
Table created.

SQL> 
insert into menu_items values (1, 'bread');
insert into menu_items values (2, 'milk');
insert into menu_items values (3, 'honey');
insert into menu_items values (4, 'cheese');
SQL> 
1 row created.

SQL> 
1 row created.

SQL> 
1 row created.

SQL> 
1 row created.

SQL> 
insert into orders values (1, to_date('2008-11-02', 'YYYY-MM-DD'));
insert into orders values (2, to_date('2008-11-03', 'YYYY-MM-DD'));
insert into orders values (3, to_date('2008-10-29', 'YYYY-MM-DD'));SQL> 
1 row created.

SQL> 
1 row created.

SQL> 
insert into order_items values (1, 1, 1);
insert into order_items values (1, 3, 1);
1 row created.

SQL> 
1 row created.

SQL> 
insert into order_items values (2, 1, 1);
insert into order_items values (2, 2, 1);
insert into order_items values (2, 3, 1);

insert into order_items values (3, 4, 10);
1 row created.

SQL> 
1 row created.

SQL> 
1 row created.

SQL> 
1 row created.

SQL> SQL> 

1 row created.

SQL> 
SELECT
    name
    , nvl(count, 0) as count
FROM 
    menu_items items 
    LEFT JOIN (
        SELECT
            menu_items.id
            , SUM(order_items.quantity) as count
        FROM 
            menu_items
            LEFT JOIN order_items ON menu_items.id = order_items.menu_item_id
            LEFT JOIN orders ON orders.id = order_items.order_id
        WHERE
            "date" between to_date('2008-11-01','YYYY-MM-DD') and to_date('2008-11-30','YYYY-MM-DD')
        GROUP BY
            menu_iteSQL>   2    3    4    5    6    7  ms.id
    ) counts on items.id = counts.id;  8    9   10   11   12   13   14   15   16   17   18  

NAME            COUNT
---------- ----------
bread               2
milk                1
honey               2
cheese              0

SQL> 
drop table menu_items;
drop table order_items;
drop table orders;SQL> 
Table dropped.

SQL> 
Table dropped.

SQL> 

Table dropped.

SQL>
```
```
PS: It's bad practice to use 'date' as a column name as it is (in most cases) a type name and can cause problems to queries and parses.