Как получить отличные значения от столбцов?

У меня есть запрос, который возвращает набор результатов, аналогичный приведенному ниже

     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.

4 голоса | спросил Prateek 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 15:45:00 +0400 2009, 15:45:00

3 ответа


0

попробуйте это

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)
ответил KM. 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 16:16:25 +0400 2009, 16:16:25
0
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
ответил Quassnoi 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 15:51:14 +0400 2009, 15:51:14
0

То, что вам нужно, на самом деле противоречит природе sql. В sql результат не зависит от порядка.

Даже если вы найдете способ получить такой результат (например, как это предоставлено Quassnoi), я бы избегал этого в SQL.

ответил Stefan Steinegger 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 16:00:42 +0400 2009, 16:00:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132