包含

时间:2017-05-23 08:44:02

标签: sql

我想知道你是否可以帮忙解决这个案例陈述。我不知道是否可以使用case语句或函数需要这样做。

所以我所拥有的是以下数据:

Group Name   |      Address      |   Contact Name   |   Group_Type
MR A Haplin     4 Fox Close          Alfred Haplin     Current Tenant
MR D Yoti       4 Fox Close          David Yoti        Former Tenant
MRS S Pox       1 Drape Ave          Shelly Pox        Current Tenant   

因此,对于上述数据,我有4只狐狸关闭的当前和前租户,以及1 Drape Ave的当前租户。

我需要某种案例陈述来表明这一点:

Group Name   |      Address      |   Contact Name   |   Group_Type     |    CASE
MR A Haplin     4 Fox Close          Alfred Haplin     Current Tenant         1
MR D Yoti       4 Fox Close          David Yoti        Former Tenant          1 
MRS S Pox       1 Drape Ave          Shelly Pox        Current Tenant         2

因此,对于包含前租户和当前租户的任何地址,我需要显示1,如果只显示当前租户而没有前租户,我需要显示2。

我可以使用任何案例陈述吗?或者是否需要创建一个函数?

3 个答案:

答案 0 :(得分:1)

这样的东西应该适用于大多数SQL版本:

SELECT t1.*, t2.status
FROM yourTable t1
INNER JOIN
(
    SELECT Address,
           CASE WHEN COUNT(*) = 2 THEN 1 ELSE 2 END AS status
    FROM yourTable
    GROUP BY Address
) t2
    ON t1.Address = t2.Address

如果每个地址都是唯一的,那么这将可靠地工作,即两个不同的组或联系人不会碰巧存在于同一地址。但最好使用某种主键列进行分组,例如一个ID。

如果您使用的是支持分析功能的数据库,那么您可以尝试以下

SELECT *,
       CASE WHEN COUNT(*) OVER (PARTITION BY Address) = 2 THEN 1 ELSE 2 END AS status
FROM yourTable

答案 1 :(得分:0)

Select t1.*,case when t2.count_address=1 Then 2 Else 1 end as Case_Column
from table1 t1
inner join
(
select address,count(*)as count_address from table1
group by address
)t2
on t1.address=t2.address

答案 2 :(得分:0)

使用2 CASE statementsinner query中的一个用于创建对应的虚拟值cas,以便能够在outer query中使用它来获取所需的标记

试试这个: -

Select a.*, case when cas>2 then 1 else cas end as case
from
your_table_name a
inner join
(
Select Address, sum(case when Group_Type='Current Tenant' then 2 
                when  Group_Type='Former Tenant' then 3
                else 0 end) as cas
from
your_table_name
group by Address
) b
on a.Address=b.Address;