Если вы не объясните более подробно, как эти значения из столбцов 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, к счастью .....