Цикл по столбцам SQL - PullRequest
       9

Цикл по столбцам SQL

5 голосов
/ 30 марта 2009

Я ищу способ перебрать столбцы таблицы для генерации вывода, как описано ниже.

Таблица выглядит так:

ID  Name     OPTION1 OPTION2 OPTION3 OPTION4 OPTION5
1   MyName1  1       0       1       1       0
2   MyName2  0       0       1       0       0

И вывод выглядит так:

MyName1 -> OPTION1, OPTION3, OPTION4
MyName2 -> OPTION3

Любые указания сделать это просто приветствуются. В противном случае, я полагаю, мне придется использовать курсор или временную таблицу ... Движок базы данных - MSSQL. Причина, по которой я занимаюсь форматированием на уровне базы данных, заключается в том, чтобы выводить его вывод в ограниченную программируемую среду.

Обновление : выход может быть в любой форме, строка или строки строк.

Обновление : Будет ли способ сделать это путем построения строки с использованием @str = @str + ...?

Обновление : Я изменил вывод ... это должно быть проще.

Спасибо!

Ответы [ 6 ]

4 голосов
/ 30 марта 2009

Ну, в случае известного количества столбцов, вы можете сделать:

SELECT  
  MyName + " ->"
  + case OPTION1 when 1 then ' OPTION1' else '' end
  + case OPTION2 when 1 then ' OPTION2' else '' end
  + ...
FROM
 Table

Если столбцы неизвестны при создании запроса - я бы, вероятно, все равно пошел бы по этому пути с некоторым динамически созданным SQL. Преимущество состоит в том, что код, вероятно, делает то, что вы хотите, и очень прост.

4 голосов
/ 30 марта 2009

Возможно, вы захотите взглянуть на таблицы PIVOT.

2 голосов
/ 30 марта 2009

Поскольку вы не отвечаете на конкретные потребности, почему вы хотите это сделать, я не могу быть уверен, но обычно, когда я вижу такой вопрос, я думаю о двух вещах:

  1. Вам необходимо нормализовать вашу базу данных. Может быть, «Option1», «Option2» и т. Д. Не имеют ничего общего, но есть также большая вероятность, что они являются повторяющейся группой в вашей таблице.

  2. Обрабатывать проблемы с отображением на уровне отображения вашего приложения - т. Е. Интерфейс, а не база данных.

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

2 голосов
/ 30 марта 2009

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

http://msdn.microsoft.com/en-us/library/ms189082.aspx

1 голос
/ 28 сентября 2012

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

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


IF NOT EXISTS( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME      
 = 'TABLE1' ) 
create table table1
(
   name nvarchar(50),       
   colvalue nvarchar(50)
)
else
  truncate table table1

declare @table nvarchar(50)
set @table = 'yourtable'

declare @column table
(
   ID integer identity,
   colname nvarchar(20)
)


insert into @column
SELECT c.name FROM sys.tables t 
JOIN sys.columns c ON t.Object_ID = c.Object_ID 
WHERE t.Name = @table 
and c.name in ('Option1','Option2','Option3','Option4','Option5')

declare @minID integer, @maxID integer
declare @cmd nvarchar(max)  
declare @col nvarchar(20)
declare @SQLStr nvarchar(max)

select @minID = MIN(ID), @maxID= MAX(ID)
from @column

while @minID <= @maxID
begin
    select @col = colname
    from @column
    where ID = @minID

    set @SQLStr =    
    'insert into table1 (name, colvalue)
    select name,' + @col + '
    from ' + @table + ' 
    where ' + @col + ' <> 0'    

    exec(@SQLStr)

    set @minID = @minID + 1
end

select distinct name, STUFF(
(SELECT  ',' + a.colvalue  AS [text()]
from Table1  a
where a.name = b.name
Order by a.colvalue
for xml PATH('')),1,1,''    ) AS Comments_Concatenated
from Table1 b
group by name, colvalue
ORDER BY name

Вам просто нужно изменить @table, указав имя таблицы и список нужных вам столбцов, прежде чем вставлять в @column.

Неважно, какой у вас тип данных, он будет работать нормально.

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