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

时间:2009-09-09 11:45:00

标签: 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

唯一的限制是,我想在Single select语句中实现这一点。没有嵌套的Select语句。

3 个答案:

答案 0 :(得分:3)

试试这个:

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)

答案 1 :(得分:1)

SELECT  A,
        CASE
        WHEN EXISTS
                (
                SELECT  NULL
                FROM    mytable mi
                WHERE   mi.id < mo.id
                        AND mi.b = mo.b
                ) THEN NULL
        ELSE    B
        END AS B,
        CASE
        WHEN EXISTS
                (
                SELECT  NULL
                FROM    mytable mi
                WHERE   mi.id < mo.id
                        AND mi.c = mo.c
                ) THEN NULL
        ELSE    c
        END AS c,
        CASE
        WHEN EXISTS
                (
                SELECT  NULL
                FROM    mytable mi
                WHERE   mi.id < mo.id
                        AND mi.d = mo.d
                ) THEN NULL
        ELSE    d
        END AS d
FROM    mytable mo

答案 2 :(得分:0)

您需要的是实际上违反sql的本质。在sql中,结果不依赖于排序。

即使你找到了获得这样结果的方法(例如Quassnoi提供的),我也会避免在SQL中这样做。