簡體   English   中英

循環遍歷列SQL

[英]Loop through columns 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 + ...構建字符串是否可以實現這一目標?

更新 :我更改了輸出...這應該更容易。

謝謝!

您可能想看一下PIVOT Tables。

那么,如果列數已知,您可以執行以下操作:

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

如果在創建查詢時列未知 - 我可能仍然會使用一些動態創建的SQL。 優點是代碼可能做你想要的並且非常簡單。

您可以使用系統目錄構建動態語句:

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

既然你沒有考慮到為什么你希望能夠做到這一點的特定需求,我無法確定,但通常當我看到這類問題時,我會想到兩件事:

  1. 您需要規范化數據庫。 也許“Option1”,“Option2”等沒有任何共同之處,但也很有可能它們是你表中的重復組。

  2. 處理應用程序顯示層中的顯示問題 - 即前端,而不是數據庫。

正如我所說,也許這些因某些特定原因不適用於你的情況,但它似乎是我從你的問題中讀到的。

如果使用數據透視表,則必須確保所有“選項”列具有相同的數據類型和長度。

我建議以下答案:


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

你只需要在插入@column之前輸入你的表名和你需要的列列表來修改@table。

無論您使用何種數據類型,它都能正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM