第1列的不同值基于第2列SQL Server

时间:2016-02-21 14:46:39

标签: sql sql-server

我有一个包含ID列和Val列的表格。对于ID的每个值,我们可以具有相同或不同的Val值。

ID  Val
1   A
1   NULL
2   00
2   00
2   00
2   00
3   00
3   A
4   A
5   00
5   00
5   A
6   A
6   A
6   NULL
6   00

从上表中,我正在寻找Val列中具有不同值的ID。如果对于任何给定的ID,Val列的所有值都相同,那么它不应该出现在结果中。

所以结果就像是。

D   Val
1   A
1   NULL
3   00
3   A
5   00
5   00
5   A
6   A
6   A
6   NULL
6   00

Id 2不应该出现,因为对于Id 2,Val列具有相同的数据。 类似地,ID 4不会出现,因为ID 4只有一行。

对于每个ID,如果我们在Val列中有多个值,那么它应该显示在结果中。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

对于满足具有不同值的条件的ID:

select id
from t
group by id
having min(id) <> max(id);

然后,您可以将其合并到一个查询中:

select t.*
from t join
     (select id
      from t
      group by id
      having min(id) <> max(id)
     ) tt
     on t.id = tt.id;

或者,您可以使用窗口函数:

select t.id, t.val
from (select t.*,
             min(val) over (partition by id) as minval,
             max(val) over (partition by id) as maxval
      from t
     ) t
where minval <> maxval;

答案 1 :(得分:0)

试试这个:

SELECT ID, Val
FROM mytable 
WHERE ID IN (SELECT ID
             FROM mytable
             GROUP BY ID
             HAVING COUNT(DISTINCT CASE 
                                     WHEN Val IS NULL THEN '' 
                                     ELSE Val
                                   END) > 1

我假设Val字段的类型为VARCHAR,并且可以是NULL<> ''

答案 2 :(得分:0)

通过三个步骤构建查询:

  1. 选择不同的值id,val(以确保您将获得空安全计数)
  2. 为每个ID计算不同的值
  3. 显示源表中的结果
  4. 尝试使用内部选择而不是subselect来加速查询。

    解决方案写在下面的查询中:

    SELECT
        t.*
    FROM
        -- select only ids with distinct count > 1
        (
            SELECT
                id
            FROM
                --  select distinct values to ensure your count of null values is real
                (
                    SELECT DISTINCT
                        id, val
                    FROM
                        t
                ) AS td
            GROUP BY
                id
            HAVING
                COUNT(*) > 1
        ) AS tc
    -- join the source table
    INNER JOIN
        t
    ON
        t.id = tc.id