выберите только столбцы, в которых есть хотя бы одна ненулевая строка. SQL сервер - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время у меня есть таблица, как показано ниже



+------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+----------+
|  country   | 0-1 days | 1-2 days | 2-3 days | 3-4 days | 4-5 days | 5-6 days | 6-7 days | 7-8 days | 8-9 days | 9-10 days | >10 days |
+------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+----------+
| country_1  |        1 |       56 |        4 |        6 |        3 |        2 |        0 |        0 |        0 |         0 |        0 |
| country_2  |        1 |        1 |        1 |        0 |        0 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_3  |        1 |        4 |        1 |        0 |        0 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_4  |        1 |        1 |        0 |        0 |        0 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_5  |        1 |        3 |        0 |        1 |        1 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_6  |        1 |       11 |        2 |        0 |        0 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_7  |        1 |       31 |        9 |        4 |        2 |        1 |        0 |        0 |        0 |         0 |        0 |
| country_8  |        1 |       15 |        0 |        0 |        0 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_9  |        1 |       13 |        2 |        3 |        0 |        0 |        1 |        0 |        0 |         0 |        0 |
| country_10 |        1 |        2 |        0 |        0 |        0 |        1 |        0 |        0 |        0 |         0 |        0 |
| country_11 |        1 |        5 |        1 |        0 |        1 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_12 |        1 |        1 |        0 |        0 |        0 |        0 |        0 |        0 |        0 |         0 |        0 |
| country_13 |        1 |        5 |        1 |        1 |        0 |        1 |        0 |        0 |        0 |         0 |        0 |
+------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+----------+


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

  1. 7-8 дней
  2. 8-9 дней
  3. 9-10 дней
  4. > 10 дней

Использование SQL Server 2016.

Редактирование Если у меня есть дополнительный столбец, например country с primary key. Как использовать dynamic sql для выбора только столбцов, которые не являются нулями?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Вы также можете использовать Cursor или while l oop для получения сведений о столбцах и динамического построения столбцов с ненулевой суммой.

попробуйте выполнить следующее:

create table test_tab (country varchar(100) ,[0-1 days] int,[1-2 days] int,[2-3 days] int,[3-4 days] int,[4-5 days] int,[5-6 days] int,[6-7 days] int,[7-8 days] int,[8-9 days] int,[9-10 days] int,[>10 days] int)
insert into test_tab select 'country_1' ,       1,      56,       4,       6,       3,       2,       0,       0,       0,        0,       0
insert into test_tab select 'country_2' ,       1,       1,       1,       0,       0,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_3' ,       1,       4,       1,       0,       0,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_4' ,       1,       1,       0,       0,       0,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_5' ,       1,       3,       0,       1,       1,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_6' ,       1,      11,       2,       0,       0,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_7' ,       1,      31,       9,       4,       2,       1,       0,       0,       0,        0,       0
insert into test_tab select 'country_8' ,       1,      15,       0,       0,       0,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_9' ,       1,      13,       2,       3,       0,       0,       1,       0,       0,        0,       0
insert into test_tab select 'country_10',       1,       2,       0,       0,       0,       1,       0,       0,       0,        0,       0
insert into test_tab select 'country_11',       1,       5,       1,       0,       1,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_12',       1,       1,       0,       0,       0,       0,       0,       0,       0,        0,       0
insert into test_tab select 'country_13',       1,       5,       1,       1,       0,       1,       0,       0,       0,        0,       0

select * from dbname.schemaname.test_tab

declare @non_zero_columns varchar(max) = ''

declare cur cursor fast_forward for
select name from dbname.sys.columns
where object_id = object_id('dbo.test_tab') and name like '%days'   --hope there is some kind of pattern

declare @col_name sysname
declare @query nvarchar(max)
declare @result int

open cur
fetch next from cur into @col_name

while @@FETCH_STATUS = 0
begin
    set @query = 'set @result = (select sum('+quotename(@col_name)+') from dbname.schemaname.test_tab)'
    exec sp_executesql @query, N'@result int out', @result out

    if (@result <> 0)
        set @non_zero_columns = @non_zero_columns + ',' + quotename(@col_name)

    fetch next from cur into @col_name
end

close cur
deallocate cur

declare @final_dynamic_sql varchar(max) = 'select country '+@non_zero_columns+' from dbname.schemaname.test_tab'

print (@final_dynamic_sql)
exec (@final_dynamic_sql)

НТН!

0 голосов
/ 20 апреля 2020

обратитесь к нижеприведенным примерам сценариев

сначала вам нужно будет найти список имен столбцов с ненулевым значением. После этого используйте динамический запрос c, чтобы выбрать из таблицы

create table sample_table
(
    ID  int identity,
    col1    int,
    col2    int,
    col3    int
)

insert into sample_table (col1, col2, col3)
values  (1, 12, 0),
    (1,  0, 0),
    (1, 13, 0),
    (1, 14, 0),
    (1, 0, 0)

declare @cols   nvarchar(max),
        @sql    nvarchar(max)

select  @cols   =
        case    when    sum(case when col1 <> 0 then 1 else 0 end) <> 0
        then    ',col1'
        else    ''
        end
+       case    when    sum(case when col2 <> 0 then 1 else 0 end) <> 0
        then    ',col2'
        else    ''
        end 
+       case    when    sum(case when col3 <> 0 then 1 else 0 end) <> 0
        then    ',col3'
        else    ''
        end 
from    sample_table

select  @sql    = 'SELECT ID' + @cols + ' '
                + 'FROM sample_table'

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