mssql - 根据另一列检索列的唯一值

时间:2017-09-12 07:49:21

标签: sql-server

我有一个包含两列的表格:ColumnAColumnB,包含行:

| A | 1 |
| B | 1 |
| B | 2 |
| C | 1 |
| C | 1 |
| C | 1 |
| A | 2 |
| B | 1 |
| A | 2 |
| A | 1 |

我想为ColumnB的每个唯一值编写一个返回ColumnA的所有唯一值的查询,其中ColumnAColumnB中的值超过1即

| A | 1 |
| A | 2 |
| B | 1 |
| B | 2 |

C 1应该省略,因为ColumnA =' C'

只有一个不同的值

2 个答案:

答案 0 :(得分:3)

可能有一种更简单的方法,但这有效:

SELECT t.ColumnA, t2.ColumnB
FROM ( select ColumnA 
       from dbo.TableName t 
       group by t.ColumnA
       having count(distinct t.ColumnB) > 1) t
CROSS APPLY ( select distinct t2.ColumnB 
              from dbo.TableName t2 
              where t.ColumnA=t2.ColumnA ) t2

第一个子查询返回具有多个(不同)ColumnA值的所有唯一ColumnB值。第二个子查询返回ColumnB - CROSS APPLY值的所有不同 ColumnA值。

答案 1 :(得分:2)

SELECT DISTINCT * FROM x WHERE ColumnA IN(
    SELECT xd.ColumnA
    FROM (
        SELECT DISTINCT ColumnA, ColumnB FROM x
    ) xd
    GROUP BY xd.ColumnA HAVING COUNT(*) > 1 
)

SELECT y.ColumnA, y.ColumnB
FROM (
    SELECT ColumnA, ColumnB, COUNT(*) OVER (PARTITION BY  ColumnA) m
    FROM x 
    GROUP BY ColumnA, ColumnB
) y
WHERE m > 1