2015-11-16 6 views
0

Я пытаюсь создать представление в SQL Server 2012, которое исключает столбцы, где запись равна null (здесь здесь 0, поэтому ее легче читать). Моя база данных этоИсключить столбцы с Null

╔════╦══════╦══════╦══════╦══════╦══════╗ 
║ ID ║ Col1 ║ Col2 ║ Col3 ║ Col4 ║ Col5 ║ 
╠════╬══════╬══════╬══════╬══════╬══════╣ 
║ 1 ║ 1 ║ 0 ║ 0 ║ 0 ║ 5 ║ 
║ 2 ║ 1 ║ 2 ║ 3 ║ 0 ║ 5 ║ 
║ 3 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ 
║ 4 ║ 0 ║ 2 ║ 3 ║ 0 ║ 0 ║ 
╚════╩══════╩══════╩══════╩══════╩══════╝ 

Что я хотел бы вернуться бы

╔════╦══════╦══════╦══════╦══════╗ 
║ ID ║ Res1 ║ Res2 ║ Res3 ║ Res4 ║ 
╠════╬══════╬══════╬══════╬══════╣ 
║ 1 ║ 1 ║ 5 ║ 0 ║ 0 ║ 
║ 2 ║ 1 ║ 2 ║ 3 ║ 5 ║ 
║ 3 ║ 0 ║ 0 ║ 0 ║ 0 ║ 
║ 4 ║ 2 ║ 3 ║ 0 ║ 0 ║ 
╚════╩══════╩══════╩══════╩══════╝ 

В этом случае, так как столбец 4 имел значение 0 во всех записях она не была включена в качестве результата. ID1 возвратил 1 и 5, пропустив 0s, и имел 0s для заполнения, так как ID2 имел 4 столбца. Если все значения равны 0, это приведет либо к возврату Res1 с 0 или без столбцов, и только к идентификаторам.

Надеюсь, это ясно. У меня возникли проблемы с объяснением этого.

+0

Почему есть 6 в строке ID 4 col Res3? – DenimChicken

+0

Потому что набрав боль. –

ответ

2

Это слишком долго для комментария.

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

может создать динамический запрос, который включает только столбцы, которые в настоящее время не являются NULL. Или вы можете создать структуру данных XML с нужными столбцами. Но столбцы в представлении фиксируются при создании представления и не могут быть добавлены и удалены при запуске представления.

+0

Спасибо. Я беспокоился об этом, но надеялся, что это крутой путь. –

0

Как сказал Гордон Линофф, вы можете сделать это с помощью Dynamic SQL, но я бы этого не сделал.

Обращайтесь с этой логикой в ​​код приложения, а не в базу данных. SQL Server не должен делать эти taks хорошо. Кодекс будет трудно поддерживать.

0

Ну, это возможно, но запрос получает некоторые действительно сложные выражения.

Первая колонка довольно легко:

Res1 = coalesce(Col1, Col2, Col3, Col4, Col5, 0), 

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

Res2 = case 
    when Col1 is not null then coalesce(Col2, Col3, Col4, Col5, 0) 
    when Col2 is not null then coalesce(Col3, Col4, Col5, 0) 
    when Col3 is not null then coalesce(Col4, Col5, 0) 
    when Col4 is not null then coalesce(Col5, 0) 
    else 0 
    end, 

С там он становится еще сложнее. Следующее значение должно определить, где были первые два использованных значения. Я даже не собираюсь это писать.

0

Если вы отбросите требование, в результате которого исключаются столбцы, где все значения равны нулю, вы можете сделать это с помощью UNPIVOT and then a PIVOT.

+0

Да, я изучил это, но в итоге у меня 60 строк, и у меня есть только что-то, что нужно увидеть. –

Смежные вопросы