如何使用GROUP BY识别行差异

时间:2015-05-28 17:46:10

标签: sql-server

我在SQL Server 2008中工作。我有以下情况。我有一个表有2列,包括主键。 (但是没有在键上定义唯一性约束。)我知道我有主键重复。每个主键,我想识别另一列中的不同值。所以,让我们说我有下表:

INSERT INTO some_table (Col1, Col2, COl3) VALUES
('A', '1', 'a'),
('A', '1', 'b'),
('B', '1', 'a'),
('B', '2', 'b'),
('C', '1', 'a'),
('C', '1', 'a'),
('C', '2', 'b')

我想按Col1和Col2进行分组,我想查找有多个不同Col3值的所有行。例如,使用上表,我希望看到: (A,1,a),(A,1,b)。

如何编写此SQL查询?我的SELECT语句需要包含Col1,Col2和Col3。但是,如果我执行GROUP BY Col1,Col2,那么我就无法在SELECT语句中使用Col3。

4 个答案:

答案 0 :(得分:1)

你不可能在group by中为每个组选择多个项目,但也许你需要这样的东西:

select
  col1,
  col2,
  stuff((select ',' + col3 from some_table t2
   where t1.col1 = t2.col1 and t1.col2 = t2.col2
   FOR XML PATH ('')), 1, 1, '') as items
from
  some_table t1
group by
  col1,
  col2
having count(distinct col3) > 1

这将在第3列的逗号分隔列表中返回“重复”项目。

SQL Fiddle

答案 1 :(得分:0)

这是实现目标的一种方式:

SELECT *
FROM
   T T1
WHERE
    EXISTS(SELECT * FROM T T2
       WHERE 
         T1.a = T2.a 
         AND T1.b = T2.b
         AND T1.c <> T2.c);

sql fiddle

或类似的变体,允许给出所需的最小不同数字:

WHERE
(SELECT COUNT(DISTINCT T2.c)
 FROM T T2
 WHERE T1.a = T2.a AND T1.b = T2.b) >= 2;

sql fiddle

答案 2 :(得分:0)

以下是解决此问题的一种方法:

;WITH CTE AS (
    Select col1, col2, min(col3) as minvalue, max(col3) as maxvalue
    From myTable
    Group by col1, col2
    Having min(col3) < max(col3)
)

Select * 
From myTable t
Inner join cte 
On t.col1 = cte.col1
     And t.col2 = cte.col2
Where col3 >= minvalue
And col3 <= maxvalue

注意直接写在这里的代码,可能会有一些错误。

答案 3 :(得分:0)

试试这个:

    CREATE TABLE #some_table
    (
    Col1 char(1),
    Col2 char(1),
    Col3 char(1)
    )

    INSERT INTO #some_table (Col1, Col2, COl3) VALUES
    ('A', '1', 'a'),
    ('A', '1', 'b'),
    ('B', '1', 'a'),
    ('B', '2', 'b'),
    ('C', '1', 'a'),
    ('C', '1', 'a'),
    ('C', '2', 'b')



    select
      stuff((select ',' + '('+Col1 +', '+ Col2 + ', ' + Col3 + ')' from #some_table T_IN
       where T.col1 = T_IN.col1 and T.col2 = T_IN.col2 FOR XML PATH ('')), 1, 1, '') as items
    from
      #some_table T
    group by col1, col2