Как отобразить «строки», которые имеют значения и столбцы NULL, сгруппированные отдельно - PullRequest
1 голос
/ 10 апреля 2019

Существует таблица с именем 'member', которая имеет 60 столбцов.Только некоторые столбцы имеют значения;5 столбцов имеют значения, а остальные 55 столбцов NULL.

Проблема в том, что столбцы со значениями разбросаны, и мне трудно искать строку, чтобы найти те, которые имеют значения.

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

select * from table order by NULLIF(value,'') = '' DESC, value

Я попробовал ниже

select * from member order by NULLIF(date_of_begin,'') 

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

ID Member Name   Age      Gender       Date of begin    DOB     DOC     Extra
1   John         34         M          4/10/2019        NULL    NULL    NULL
2   Jack         NULL       M          4/11/2019        NULL    NULL    NULL
3   David        54         M          4/15/2019        NULL    NULL    NULL
4   Eric         NULL       M          4/16/2019        NULL    NULL    NULL
5   Ivan         45         M          4/10/2019        NULL    NULL    NULL

Я хочу оператор выбора, который разделит приведенный выше пример с приведенной ниже группировкой,Возраст равен нулю для Джека, поэтому он должен быть помещен в последний столбец и отображен.Это облегчит мою работу по поиску того, какие столбцы имеют NULL, а какие отсортированы.

Например-->

Select * from member where id =2 IS NOT NULL (I need help here in this statement change)

Желаемые результаты:

ID  Member Name       Gender       Date of begin    DOB     DOC     Extra  Age
2    Jack               M          4/11/2019        NULL    NULL    NULL   NULL

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

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

Мы используем CROSS APPLY, чтобы отменить вывод ваших результатов, а затем избавиться от значений NULL. Ваши данные больше не похожи на ряд, но вам нужно несколько точек данных.

Используя CROSS APPLY, чтобы получить все значения столбцов в одном столбце, я CAST все они как NVARCHAR данные, так что ваши результаты все текстовые поля.

В этом примере я вернул два значения ID, чтобы вы могли видеть, как это будет выглядеть.

Настройка данных, на случай, если кто-то еще захочет поиграть:

DECLARE @table TABLE(
   ID            INTEGER  NOT NULL PRIMARY KEY 
  ,Member_Name   VARCHAR(5) NULL
  ,Age           INTEGER NULL
  ,Gender        VARCHAR(1) NULL
  ,Date_of_begin DATE  NOT NULL
  ,DOB           VARCHAR(4) NULL
  ,DOC           VARCHAR(4) NULL
  ,Extra         VARCHAR(4) NULL
);
INSERT INTO @table(ID,Member_Name,Age,Gender,Date_of_begin,DOB,DOC,Extra) VALUES (1,'John',34,'M','4/10/2019',NULL,NULL,NULL);
INSERT INTO @table(ID,Member_Name,Age,Gender,Date_of_begin,DOB,DOC,Extra) VALUES (2,'Jack',NULL,'M','4/11/2019',NULL,NULL,NULL);
INSERT INTO @table(ID,Member_Name,Age,Gender,Date_of_begin,DOB,DOC,Extra) VALUES (3,'David',54,'M','4/15/2019',NULL,NULL,NULL);
INSERT INTO @table(ID,Member_Name,Age,Gender,Date_of_begin,DOB,DOC,Extra) VALUES (4,'Eric',NULL,'M','4/16/2019',NULL,NULL,NULL);
INSERT INTO @table(ID,Member_Name,Age,Gender,Date_of_begin,DOB,DOC,Extra) VALUES (5,'Ivan',45,'M','4/10/2019',NULL,NULL,NULL);

Вот запрос.

SELECT 
  c.*
FROM @table AS t
CROSS APPLY (VALUES ('ID',CAST(t.ID AS NVARCHAR(30))),
                    ('Member_Name',CAST(t.Member_Name AS NVARCHAR(30))),
                    ('Age',CAST(t.Age AS NVARCHAR(30))),
                    ('Gender',CAST(t.Gender AS NVARCHAR(30))),
                    ('Date_of_begin',CAST(t.Date_of_begin AS NVARCHAR(30))),
                    ('DOB',CAST(t.DOB AS NVARCHAR(30))),
                    ('DOC',CAST(t.DOC AS NVARCHAR(30))),
                    ('Extra',CAST(t.Extra AS NVARCHAR(30)))
            ) c (ColName,ColValue)
WHERE t.ID IN (2,3)
AND c.ColValue IS NOT NULL
ORDER BY 
  t.ID,
  CASE
    WHEN c.ColName = 'ID' THEN 1
    WHEN c.ColName = 'Member_Name' THEN 2
    ELSE 3
  END 

Результаты:

+---------------+------------+
|    ColName    |  ColValue  |
+---------------+------------+
| ID            | 2          |
| Member_Name   | Jack       |
| Gender        | M          |
| Date_of_begin | 2019-04-11 |
| ID            | 3          |
| Member_Name   | David      |
| Age           | 54         |
| Gender        | M          |
| Date_of_begin | 2019-04-15 |
+---------------+------------+
0 голосов
/ 10 апреля 2019

Решение, которое я предлагаю, - сохранить одну запись в n строках ,

n - количество столбцов,

тогда вы можете заказать результат по вашему желанию, используя заказ по или добавьте критерии на основе значений NULL Я использую системные таблицы sql server syscolumn s и sysobjects

create table tab_mytable (id int ,colonne varchar(100),valeur varchar(100));
insert into tab_mytable(id,colonne) select c.colid,c.name from sysobjects o inner join 
syscolumns c on o.id=c.id where o.name='member' order by c.colid

declare @cmd as varchar(1000)
declare @mytab as table (val varchar(100))

declare mycursor  cursor for select colonne from tab_mytable
declare @colonne as varchar(100)
declare @val as varchar(100)
open mycursor
fetch mycursor into @colonne
while @@fetch_status=0
begin
set @cmd= 'select '+@colonne +' from member where id=2'
insert into @mytab exec(@cmd)
select @val=val from @mytab
set @cmd='update tab_mytable set valeur='''+@val+''' where colonne='''+@colonne+''''
exec(@cmd)
print @cmd
delete from @mytab
fetch mycursor into @colonne
end
close mycursor
deallocate mycursor
--Put here your Query to display teh results as you wish
select * from tab_mytable order by valeur

Вы также можете использовать оператор UNPIVOT

Но при таком использовании вы должны написать все имена столбцов, для решения, приведенного выше, вы не будете писать их в своем скрипте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...