首页 > 解决方案 > 具有分区依据的 SQL 案例并选择具有特定值的行

问题描述

我有一个场景,我必须使用 case 条件,如果值匹配,那么我需要从表中获取值,否则我需要将其硬编码为 1 和 0 。

License

Number   permit   reviewpermit   State
---------------------------------------
101       0        1              TX
101       1        0              OK
101       1        1              NC
102       1        1              LA
102       0        1              OK

健康)状况 :

  1. 如果“数字”组的任何状态为“TX”,则从该“数字”组的所有其他状态的 TX 状态中选择“许可”、“审查许可”值。
  2. 如果它是“数字”组的其他状态,则为该“数字”组的所有状态选择“1”作为“许可”,选择“0”作为“审查许可”。

期望的输出:

Number   permit   reviewpermit   State
--------------------------------------
101       0        1              TX
101       0        1              OK
101       0        1              NC
102       1        0              LA     
102       1        0              OK

根据德克萨斯州,101 组具有所有 permit 和 reviewpermit 值。102 组具有所有 permit 和 reviewpermit 值,分别为“1”和“0”。

这是我到目前为止写的代码:

 SELECT
     Number,
     MAX(CASE WHEN State = 'TX' THEN Permit ELSE 1 END) OVER (PARTITION BY [Number]) AS permit, 
     MAX(CASE WHEN State = 'TX' THEN ReviewPermit ELSE 0 END) OVER (PARTITION BY [Number]) AS reviewpermit, 
     state
 FROM 
     License

但它不会返回所需的输出。

标签: sqlsql-serverwindow-functions

解决方案


我认为这个逻辑可以满足您的要求:

select Number,
       coalesce(MAX(CASE WHEN State = 'TX'  THEN Permit END) OVER (PARTITION BY [Number]),
                1) as permit, 
       coalesce(MAX(CASE WHEN State = 'TX' THEN ReviewPermit END) OVER (PARTITION BY [Number]),
                0) AS reviewpermit, state
from License;

这将检查MAX(). 如果不存在,则值为NULL,因此将COALESCE()采用默认值。


推荐阅读