【问题标题】:SELECT SQL based on one Condition in Column Value基于列值中的一个条件选择 SQL
【发布时间】:2018-02-23 18:41:12
【问题描述】:

有人可以帮助我使用以下数据进行 SQL 查询吗?

每当我看到该类型处于停用状态而与相同 ID 中的其他类型无关时,我只需要获取停用值,其余值应为空。

select     id,     
pid,    
type,    
case when type='deactivate' then null as value1 else value1 end,     
case when type='deactivate' then  null as value2 else value2 end,     
case when type='deactivate' then  null as value3 else value3 end,     
case when type='deactivate' then null as value4 else value4 end,     
case when type='deactivate' then null as value5 else value5 end,     
case when type='deactivate' then value6 end,     
case when type='deactivate' then deactivate_date end,     
case when type='deactivate' then status end     
from typetable  

但每当 pid 发生变化时,我都会得到 value1 到 5 的值。 每当我看到 type='deactivate' 时,我的数据中有什么方法我必须忽略同一 ID 中所有类型的 value1 到 5 的值吗? 输出应该类似于下面提到的 ID-1 和 3 的空值。

id  pid type    value1  value2  value3  value4  value5  value6  deactive date   Status
0   1   case    99  null    null    null    null    null    null    
0   2   test    null    101 null    null    null    null    null    
0   3   levels  null    null    CAAD    null    null    null    null    
0   4   package null    null    null    null    DSIT    null    null    

1   1   case    null    null    null    null    null    null    null    
1   2   test    null    null    null    null    null    null    null    
1   3   levels  null    null    null    null    null    null    null    
1   4   package null    null    null    null    null    null    null    
1   5   deactivate  null    null    null    null    null    9999999 9/1/2014    Void ID

2   1   case    CLR 6#  null    null    null    null    null    null    
2   2   test    null    6   null    null    null    null    null    
2   3   levels  null    null    MAA null    null    null    null    

3   1   case    null    null    null    null    null    null    null    
3   2   test    null    null    null    null    null    null    null    
3   3   levels  null    null    null    null    null    null    null    
3   4   package null    null    null    null    null    null    null    
3   5   deactivate  null    null    null    null    null    9999999 1/7/2016    Closed

【问题讨论】:

  • 只有当我得到类型 deactivate 时,每种类型下都有值,如果类型不是“DEACTIVATE”,只需将 null 设为 1 到 5 的值,那么我必须获取所有值
  • 这个问题真的很不清楚:这就是我的理解。对于每个 id,如果有任何行具有相同的 id 并键入 deactivate,则隐藏整个组的所有值。

标签: sql sql-server


【解决方案1】:
declare @t table (id int, pid int, col1 varchar(10), col2 varchar(10)) 
insert into @t 
       values (1, 1, 'askjdf', 'laskjdf')
            , (1, 2, 'asksfjdf', 'ljdf')
            , (2, 1, 'askjdf', 'laskjdf')
            , (2, 2, 'deact', 'laskjdf');

select t.* 
from @t t 
where not exists (select 1 from @t tm where tm.id = t.id and tm.col1 = 'deact') 
union all 
select t.id, t.pid, t.col1, null  
from @t t 
where     exists (select 1 from @t tm where tm.id = t.id and tm.col1 = 'deact') 
order by id, pid;

【讨论】:

    【解决方案2】:

    这样的事情会起作用:

    select
        id, pid,
        case when masked = 0 then value 1 else null end as value1,
        ...
    from <table> t cross apply (
        select max(case when t2.type = 'deactivate' then 1 else 0 end)
        from <table> t2
        where t2.id = t.id
    ) m(masked)
    

    类似,而且可能更好:

    with data as (
        select *,
            max(case when type = 'deactivate' then 1 else 0 end)
                over (partition by id) as masked
        from <table>
    )
    select
        id, pid,
        case when masked = 0 then value 1 else null end as value1,
        ...
    from data;
    

    【讨论】:

      【解决方案3】:

      如果您在id AND type='deactivate' 上进行自左连接并检查连接表的类型字段而不是左表的类型字段,则最简洁且最简单:

      select t1.id,t1.pid,t1.type,
      case when t2.type='deactivate' then null else t1.value1 end AS value1,
      case when t2.type='deactivate' then null else t1.value2 end AS value2, 
      case when t2.type='deactivate' then null else t1.value3 end AS value3, 
      case when t2.type='deactivate' then null else t1.value4 end AS value4, 
      case when t2.type='deactivate' then null else t1.value5 end AS value5, 
      case when t2.type='deactivate' then t1.value6 end AS value6, 
      case when t2.type='deactivate' then t1.deactivate_date end AS deactivate_date, 
      case when t2.type='deactivate' then t1.status end from typetable t1 
      LEFT JOIN typetable t2 ON t1.id=t2.id AND t2.type='deactivate'
      

      【讨论】:

      • 我已经尝试过这个查询,但是当类型发生变化时,如果 id 1 和 3,值将从 value1 变为 5
      • @Sai 你一定是做错了什么,或者你的数据和截图不一样。无论类型如何,此查询都会在 id=1 的 value1-5 列中产生空值。
      猜你喜欢
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多