У меня есть таблица, которая выглядит следующим образом:Попытка выбора строк и включают в себя первые 2 различных ненулевых значений из 4 столбцов
CREATE TABLE [Test].[dbo].[MyTest]
(
[Id] INT NOT NULL,
[ColA] VARCHAR(255) NULL,
[ColB] VARCHAR(255) NULL,
[ColC] VARCHAR(255) NULL,
[ColD] VARCHAR(255) NULL
);
И скажем, у меня есть:
Id ColA ColB ColC ColD
---------------------------------------
1 A B NULL C
2 A A NULL D
3 NULL A B NULL
4 B B B B
5 NULL NULL NULL NULL
Я Я пытаюсь сделать это, чтобы выбрать каждую строку из этой таблицы, но только для первых двух отличных ненулевых значений от ColA-ColD. Другими словами, если для одной строки ColA & ColB оба являются ненулевыми и отличаются друг от друга, это те, которые я хочу для этой строки. Используя данные, которые я дал выше, пожелавшие результаты этого запроса будет:
1, A (from ColA), B (from ColB)
2, A (from ColA), D (from ColD)
3, A (from ColB), B (from ColC)
4, B (from ColA)
Обратите внимание, что если все данные КОЛА-D для ряда является NULL, что строка не выбрана. Также это нормально, если есть только один ненулевой отдельный столбец (вы можете видеть из строки результата с Id 4) - это не должно быть 2, но в идеале это будет 2.
В принципе я бы идеально был способный получить TOP (2) DISTINCT из ColA-ColD WHERE, ни один из них не имеет значения NULL, но я понимаю, что TOP и DISTINCT работают над строками, а не в столбцах, которые я пытаюсь сделать. Любая помощь очень ценится.
Спасибо!
Вы можете сказать, что «второй столбец - это второе ненулевое значение» - изначально я думал, что ваш будет включать в себя значения null (которые будут отличаться от фактического значения). И можно отфильтровать только нулевые строки в cte. –
@ X-Zero: У вас есть точка, «отличная» в языке SQL будет включать значение «NULL». Я объяснил свое объяснение, спасибо. –
Блестящий! Это должно работать лучше, чем много вложенных заявлений COALESCE (хотя я тоже начинал думать об этом на этом маршруте и очень ценю ответ там Mark). Спасибо!! – fogwolf