sql - 如何从列中获取不同的值?

标签 sql sql-server sql-server-2005 tsql

我有一个查询返回类似于下面的结果集

     A    | B  | C  |    D
     -----|----|----|-----
1    abc  | d0 | e0 | true
2    def  | d0 | e1 | true
3    ghi  | d0 | e2 | true
4    jkl  | d1 | e1 | true
5    mno  | d2 | e2 | false

在 A 列中,每个值都是唯一的。但 B、C、D 列有一些重复值。 我想要 A 列的所有值,但 B、C、D 列的不同值。

预期的结果是这样的

     A    | B   | C   |    D
     -----|---- |---- |-----
1    abc  | d0  | e0  | true
2    def  | NULL| e1  | NULL
3    ghi  | NULL| NULL| NULL
4    jkl  | d1  | NULL| NULL
5    mno  | d2  | e2  | false

唯一的限制是,我想在单个选择语句中实现这一点。没有嵌套的 Select 语句。

最佳答案

试试这个:

DECLARE @YourTable table (A char(3), B char(2), C char(2), D varchar(5))
INSERT INTO @YourTable VALUES ('abc','d0','e0','true')
INSERT INTO @YourTable VALUES ('def','d0','e1','true')
INSERT INTO @YourTable VALUES ('ghi','d0','e2','true')
INSERT INTO @YourTable VALUES ('jkl','d1','e1','true')
INSERT INTO @YourTable VALUES ('mno','d2','e2','false')


SELECT
    A
    ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY B ORDER BY A,B)=1 THEN B ELSE NULL END AS B
    ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY C ORDER BY A,C)=1 THEN C ELSE NULL END AS C
    ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY D ORDER BY A,D)=1 THEN D ELSE NULL END AS D
    FROM @YourTable 
    ORDER BY A,B,C,D

输出:

A    B    C    D
---- ---- ---- -----
abc  d0   e0   true
def  NULL e1   NULL
ghi  NULL e2   NULL
jkl  d1   NULL NULL
mno  d2   NULL false

(5 row(s) affected)

关于sql - 如何从列中获取不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399199/

相关文章:

sql - 在 SQL Server 2005 中使用 TABLOCK 和 HOLDLOCK 提示是否会完全阻止插入直到事务结束?

java - 准备好的语句和串行数据类型

sql-server - 要调试此项目,您必须启用 sql/clr

sql - 将字符串拆分到表中

sql - 如何在 SQL 中计算该月的最后一天?

entity-framework - Entity Framework 和 SQL Server View

sql - 在单个 T-SQL 语句中多次返回时间戳

java - 无法创建表 'basque30.newreferral'(错误号 : 150)

mysql - 在 SQL 中组合非唯一值

sql-server - SQL Server 2005 中以句点分隔的字符串的自然顺序