2009-03-30 4 views
5

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

таблица выглядит следующим образом:

 
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 + ...?

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

Спасибо!

+0

У вас есть фиксированное количество столбцов? (также «Option4 -> MyName1»?) –

+0

Привет, Ян, давайте предположим, что у нас есть фиксированное количество столбцов. –

+0

Я думаю, что его неясно, какой должен быть результат. Вы хотите взять таблицу и сгенерировать текстовые строки? Решение «сводной таблицы» приведет к набору результатов или другой таблице. –

ответ

4

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

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

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

+0

Не знаю, почему я об этом не думал ... Спасибо. –

4

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

+0

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

2

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

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

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

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

+0

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

+0

Да, это был бы один из тех случаев, когда такая вещь становится необходимой. Продолжать. ;) –

1

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

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


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 путем ввода в имени таблицы и списка столбца, нужно, прежде чем insret в @ колонка.

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

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