【问题标题】:SQL select flag based on count and/or flag of joined tableSQL 根据连接表的计数和/或标志选择标志
【发布时间】:2014-06-27 08:44:48
【问题描述】:

我有一个客户表和一个地址表。

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

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

我希望能够查询这两个表并根据地址数据为每个客户生成一个标志 - 没有地址记录 = NONE,1 个或多个 INVOICE 记录 = HASINVOICE,没有 INVOICE 但有 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,这是否可能,使用单个查询而不使用游标?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2000


    【解决方案1】:

    我手边没有 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
    

    【讨论】:

    • @podiluska - 是的。 2000 BOL 仍然是available。即使没有,这也只是为了构建一个独立的脚本来演示该技术。我想 OP 会将其重新写回原来的表中。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2023-01-13
    • 2022-01-03
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多