Question

I have a Customer table and an Address table.

The Address table has a flag which is either INVOICE, CORRESPONDENCE or DELIVERY.

A Customer can have 0 to many Address records.

I want to be able to query both tables and generate a flag for each customer based on the address data - no address records = NONE, 1 or more INVOICE records = HASINVOICE, no INVOICE but 1 or more others = HASOTHER

so, for the following data:

+------------+---------+
| CustomerID |  Name   |
+------------+---------+
|          1 | Peter   |
|          2 | Ray     |
|          3 | Egon    |
|          4 | Winston |
|          5 | Dana    |
+------------+---------+

+-----------+------------+----------------+
| AddressID | CustomerID |  AddressType   |
+-----------+------------+----------------+
|         1 |          1 | INVOICE        |
|         2 |          1 | DELIVERY       |
|         3 |          2 | DELIVERY       |
|         4 |          2 | CORRESPONDENCE |
|         5 |          4 | INVOICE        |
|         6 |          5 | CORRESPONDENCE |
+-----------+------------+----------------+

I would expect the following output:

+------------+---------+-------------+
| CustomerID |  Name   | AddressFlag |
+------------+---------+-------------+
|          1 | Peter   | HASINVOICE  |
|          2 | Ray     | HASOTHER    |
|          3 | Egon    | NONE        |
|          4 | Winston | HASINVOICE  |
|          5 | Dana    | HASOTHER    |
+------------+---------+-------------+

Is this possible, for SQL 2000, using a single query and no cursors?

Était-ce utile?

La solution

I don't have a 2000 instance handy (you really should upgrade, you're 4-5 releases behind), but I think that this should work:

declare @Customers table (CustomerID int,Name varchar(10))
insert into @Customers (CustomerID,Name)
select 1,'Peter' union all    select 2,'Ray' union all
select 3,'Egon' union all    select 4,'Winston' union all
select 5,'Dana'

declare @Addresses table (AddressID int, CustomerID int,
                          AddressType varchar(30))
insert into @Addresses (AddressID,CustomerID,AddressType)
select 1,1,'INVOICE' union all    select 2,1,'DELIVERY' union all
select 3,2,'DELIVERY' union all    select 4,2,'CORRESPONDENCE' union all
select 5,4,'INVOICE' union all    select 6,5,'CORRESPONDENCE'

select
    c.CustomerID,
    c.Name,
    CASE MAX(CASE 
        WHEN a.AddressType = 'Invoice' THEN 2
        WHEN a.AddressType IS NOT NULL THEN 1
        END
    ) WHEN 2 THEN 'HASINVOICE'
    WHEN 1 THEN 'HASOTHER'
    ELSE 'NONE'
    END as AddressFlag
from
    @Customers c
        left join
    @Addresses a
        on
            c.CustomerID = a.CustomerID
group by
    c.CustomerID,
    c.Name

Produces:

CustomerID  Name       AddressFlag
----------- ---------- -----------
5           Dana       HASOTHER
3           Egon       NONE
1           Peter      HASINVOICE
2           Ray        HASOTHER
4           Winston    HASINVOICE
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top