2014-05-09 2 views
0

고객 테이블과 주소 테이블이 있습니다.합계 테이블의 개수 및/또는 플래그를 기반으로 한 SQL 선택 플래그

주소 테이블에는 INVOICE, CORRESPONDENCE 또는 DELIVERY 플래그가 있습니다.

고객은 0 개 이상의 주소 레코드를 가질 수 있습니다.

주소 테이블을 기반으로 각 고객에 대해 플래그를 생성 할 수 있습니다. 주소 레코드 없음 = NONE, 1 개 이상 INVOICE 레코드 = HASINVOICE, INVOICE는 없지만 하나 이상의 기타 = HASOTHER

때문에, 다음과 같은 데이터 : 하나의 가야를 사용하여, SQL 2000,

+------------+---------+-------------+ 
| CustomerID | Name | AddressFlag | 
+------------+---------+-------------+ 
|   1 | Peter | HASINVOICE | 
|   2 | Ray  | HASOTHER | 
|   3 | Egon | NONE  | 
|   4 | Winston | HASINVOICE | 
|   5 | Dana | 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 | 
+-----------+------------+----------------+ 

나는 다음과 같은 출력을 기대 커서와 커서가 없습니까?

답변

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