Как избежать нулевых значений - PullRequest
0 голосов
/ 25 декабря 2011

Как избежать нулевых значений ...

Table1

ID Value1 Value2

001 Rajan  null
001 Vijayan null
001 null ravi
001 null sudeep
002 kumar null
002 null venkat
.....

Я не хочу отображать нулевые значения.

Ожидаемый результат

 ID Value1 Value2

    001 Rajan  ravi
    001 Vijayan sudeep
    002 kumar venkat
    .....

Как сделать запрос для вышеуказанного условия

Нужна помощь по запросу

Ответы [ 2 ]

3 голосов
/ 25 декабря 2011

Если вы не объясните более подробно, как эти значения из столбцов Value1 и Value2 принадлежат друг другу, и только если это "соответствие" действительно детерминировано, вы можете сделать что-то вроде этого:

DECLARE @temp TABLE (ID INT, Value1 VARCHAR(20), Value2 VARCHAR(20))

INSERT INTO @temp
        (ID, Value1, Value2)
VALUES
        (1, 'Rajan', NULL),
        (3, 'Vijayan', NULL),
        (1, NULL, 'Ravi'),
        (3, NULL, 'sudeep'),
        (2, 'kumar', NULL),
        (2, NULL, 'venkat')

SELECT DISTINCT
   ID, 
   (SELECT Value1 FROM @temp t2 WHERE t2.ID = t.ID AND Value1 IS NOT NULL) AS 'Value1',
   (SELECT Value2 FROM @temp t2 WHERE t2.ID = t.ID AND Value2 IS NOT NULL) AS 'Value2'
FROM
   @temp t

Это даст вам одну строку для каждого значения ID с ненулевым значением для Value1 и ненулевым значением для Value2.

Но поскольку ваш вопрос стоит прямо сейчас, этот подход не работает, поскольку у вас есть несколько записей для одного и того же идентификатора - и нет объяснения того, как сопоставить два разных значения вместе ...

Так что, как сейчас, я бы сказал, что нет никакого детерминистического и правильного решения вашего вопроса. Вам нужно предоставить больше информации, чтобы мы могли найти решение для вас.

Обновление: Если бы вы обновились до SQL Server 2005 или новее, вы могли бы сделать что-то вроде двух вложенных CTE - но в этом случае вам также придется определить некоторые Правило / порядок относительно как два варианта с ID = 001 соединены вместе .....

Что-то вроде:

DECLARE @temp TABLE (ID INT, Value1 VARCHAR(20), Value2 VARCHAR(20))

INSERT INTO @temp
        (ID, Value1, Value2)
VALUES
        (1, 'Rajan', NULL),
        (1, 'Vijayan', NULL),
        (1, NULL, 'Ravi'),
        (1, NULL, 'sudeep'),
        (2, 'kumar', NULL),
        (2, NULL, 'venkat')

;WITH Value1CTE AS
(
    SELECT ID, Value1,
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value1) AS 'RowNum'
    FROM @temp
    WHERE Value1 IS NOT NULL
),
Value2CTE AS
(
    SELECT ID, Value2,
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value2) AS 'RowNum'
    FROM @temp
    WHERE Value2 IS NOT NULL
)
SELECT 
   v1.ID, 
    v1.Value1, v2.Value2
FROM
   Value1CTE v1
INNER JOIN 
    Value2CTE v2 ON v1.ID = v2.ID AND v1.RowNum = v2.RowNum

даст вам воспроизводимый результат:

ID  Value1  Value2
1   Rajan   Ravi
1   Vijayan sudeep
2   kumar   venkat

Предполагается, что при наличии двух записей с идентификатором SAME вы хотите отсортировать (ORDER BY) фактические значения (например, Rajan до Vijayan и Ravi до sudeep -> там вы объедините Rajan и Ravi вместе, а также Vijayan и sudeep).

Но опять же: это в SQL Server 2005 и только новее - нет эквивалента в SQL Server 2000, к счастью .....

0 голосов
/ 25 декабря 2011
SELECT i1.ID, i2.Value1, i3.Value2
FROM Table1 i1, Table1 i2, Table1 i3
WHERE i1.ID = i2.ID and i1.ID = i3.ID and i2.Value1 IS NOT NULL and i3.Value2 IS NOT NULL;
...