2014-05-09 21 views
0

我有一个客户表和一个地址表。基于加入表的计数和/或标志的SQL选择标志

地址表有一个标志,它是INVOICE,CORRESPONDENCE或DELIVERY。

客户可以有0到多个地址记录。

我希望能够查询表和生成基于地址数据的每个客户的一个标志 - 没有地址记录= NONE,1个或多个发票记录= HASINVOICE,没有发票,但1个或多个其他= HASOTHER

因此,下列数据:

+------------+---------+ 
| 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 | 
+-----------+------------+----------------+ 

我希望下面的输出:

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

这是可能的,对于SQL 2000,使用单个阙ry和没有游标?

回答

3

我没有2000实例方便(你真的应该升级,你4-5落后的版本),但我认为这应该工作:

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 

产地:

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

@podiluska - 是的。 2000年BOL仍然[可用](http://technet.microsoft.com/en-us/library/aa258839(v = sql.80).aspx)。即使它没有,这只是构建一个演示该技术的自包含脚本。我可以想象OP会将它重新写回原来的表格。 –

+0

今年我们正在升级!我的行业轮子慢慢转动...... – Shevek