【问题标题】:How to ignore row of null column values in SQL Server query when another row exists with non null column values for the same Id当存在具有相同 Id 的非空列值的另一行时,如何在 SQL Server 查询中忽略空列值行
【发布时间】:2016-11-04 21:21:39
【问题描述】:

注意:老实说,不知道如何命名。 :/

使用以下 SQL 查询,我得到以下结果。

select distinct P.ID
        ,P.LASTNAME
        ,P.FIRSTNAME
        ,T.FLAG
        ,CASE WHEN T.FLAG = 'T' THEN T.NAME ELSE NULL END AS NAME
        ,CASE WHEN T.FLAG = 'T' THEN R.T_NUMBER ELSE NULL END AS T_NUMBER
        ,CASE WHEN T.FLAG = 'T' THEN T.E_NUMBER ELSE NULL END AS E_NUMBER
        ,CASE WHEN T.FLAG = 'T' THEN R.S_NUMBER ELSE NULL END AS S_NUMBER
from P
left outer join R on R.P_ID = P.ID 
left outer join T on T.ID = R.T_ID




ID  LASTNAME    FIRSTNAME   FLAG    NAME    T_NUMBER    E_NUMBER    S_NUMBER
11  ME          LOU         F       NULL    NULL        NULL        NULL
11  ME          LOU         T       NAME1   11          123         11115
11  ME          LOU         T       NAME2   22          456         22225
11  ME          LOU         T       NAME3   33          789         33335
11  ME          LOU         T       NAME4   44          012         44445
12  DON         JOE         NULL    NULL    NULL        NULL        NULL
13  SAM         CAR         NULL    NULL    NULL        NULL        NULL

我对查询进行了哪些更改,以便第一行不会在结果集中返回,因为其他 ID 为 11 的行包含数据,同时仍返回与最后两行类似的行,因为 ID 为 12 没有其他行还有 13 个?

给定一个 ID,如果存在具有相同 ID 的行包含非 null NAME、T_NUMBER、E_NUMBER、S_NUMBER 数据,那么我也不希望所有这些列中都包含 null 的行。 以下是我想要的输出。

ID  LASTNAME    FIRSTNAME   FLAG    NAME    T_NUMBER    E_NUMBER    S_NUMBER
11  ME          LOU         T       NAME1   11          123         11115
11  ME          LOU         T       NAME2   22          456         22225
11  ME          LOU         T       NAME3   33          789         33335
11  ME          LOU         T       NAME4   44          012         44445
12  DON         JOE         NULL    NULL    NULL        NULL        NULL
13  SAM         CAR         NULL    NULL    NULL        NULL        NULL

我已经尝试/测试过使用distinctgroup byunion,但没有成功。

我不想要ME LOU 的第一行的原因是因为我知道存在包含更多数据的记录,并且我可以从这些记录中获取此人的姓名。

我想要最后两行的原因是因为我仍然想要那个人记录,以便我知道他们存在。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    如果我理解正确,您想过滤掉超过 1 行的 'F' 行。如果是这样:

    with t as (
          <your query here>
         )
    select t.*
    from (select t.*, count(*) over (partition by id) as cnt
          from t
         ) t
    where cnt = 1 or flag <> 'F';
    

    【讨论】:

      【解决方案2】:

      根据您实际查询的复杂程度,您也可以在两个UNION 语句中执行此操作,均排除您不想要的条件:

      select distinct P.ID
              ,P.LASTNAME
              ,P.FIRSTNAME
              ,T.FLAG
              ,T.NAME AS NAME
              ,R.T_NUMBER AS T_NUMBER
              ,T.E_NUMBER AS E_NUMBER
              ,R.S_NUMBER AS S_NUMBER
      from P
      inner join R on R.P_ID = P.ID 
      inner join T on T.ID = R.T_ID
      where
      T.FLAG = 'T'  -- excludes T.FLAG = 'F'
      
      UNION ALL
      
      select P.ID
              ,P.LASTNAME
              ,P.FIRSTNAME
              ,NULL
              ,NULL
              ,NULL
              ,NULL
              ,NULL
      from P
      left outer join R on P.ID = R.P_ID  
      where
      R.T_ID is null  -- excludes T.FLAG is not null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 2020-01-06
        • 2021-11-20
        • 2017-04-23
        • 2016-06-04
        相关资源
        最近更新 更多