2009-03-30 42 views
5

Tôi đang tìm cách lặp qua các cột của bảng để tạo đầu ra như được mô tả bên dưới.Lặp qua các cột SQL

Bảng trông như thế:

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

Và đầu ra trông như thế:

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

Bất kỳ hướng để làm điều này chỉ đơn giản là sẽ được đánh giá rất nhiều. Nếu không, tôi cho rằng tôi sẽ phải sử dụng một con trỏ hoặc một bảng tạm thời ... Cơ sở dữ liệu là MSSQL. Lý do tôi đang làm định dạng ở cấp cơ sở dữ liệu là để cung cấp đầu ra của nó vào một môi trường lập trình giới hạn.

Cập nhật: ouput có thể dưới mọi hình thức, chuỗi hoặc hàng chuỗi.

Cập nhật: Sẽ là cách để thực hiện điều đó bằng cách tạo chuỗi bằng @str = @str + ...?

Cập nhật: Tôi đã thay đổi đầu ra ... việc này sẽ dễ dàng hơn.

Cảm ơn!

+0

Bạn có một số cố định các cột? (cũng "Option4 -> MyName1"?) –

+0

Hi Ian, Có giả sử chúng ta có một số cột cố định. –

+0

Tôi nghĩ rằng nó không rõ ràng những gì đầu ra nên được. Bạn có muốn lấy một bảng và tạo chuỗi văn bản không? Giải pháp "bảng tổng hợp" sẽ dẫn đến kết quả hoặc bảng khác. –

Trả lời

4

Vâng, trong trường hợp của một số tiếng của các cột, bạn có thể làm:

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

Nếu cột chưa được biết khi bạn tạo các truy vấn - Tôi muốn có lẽ vẫn đi theo con đường đó với một số SQL động tạo ra. Ưu điểm là mã có thể làm những gì bạn muốn và rất đơn giản.

+0

Không chắc tại sao tôi không nghĩ về điều đó ... Cảm ơn. –

4

Bạn có thể muốn có một cái nhìn tại các bảng tổng hợp.

+0

Phải, bảng tổng hợp có thể sử dụng được. Kiểm tra xem có những ý tưởng mới khác về phương pháp mà tôi không biết. –

2

Vì bạn không đi vào nhu cầu cụ thể về việc tại sao bạn muốn để có thể làm được điều này tôi không thể chắc chắn , nhưng thường khi tôi thấy loại câu hỏi này, có hai điều tôi nghĩ đến:

  1. Bạn cần phải chuẩn hóa cơ sở dữ liệu của mình. Có thể "Option1", "Option2" vv không có điểm gì chung, nhưng cũng có khả năng là họ là một nhóm lặp lại trong bảng của bạn.

  2. Xử lý sự cố hiển thị trong lớp hiển thị của ứng dụng - tức là giao diện người dùng, không phải cơ sở dữ liệu.

Như tôi đã nói, có thể những điều này không áp dụng trong trường hợp của bạn vì một số lý do cụ thể, nhưng có vẻ như từ những gì tôi đã đọc câu hỏi của bạn.

+0

Phải, Tom. Lý do tôi đang cố gắng để định dạng ở cấp cơ sở dữ liệu là có thể cung cấp dữ liệu đầu ra trực tiếp trong một báo cáo mà ở đó tôi không có nhiều tính linh hoạt trong kịch bản lệnh. –

+0

Đúng, đó sẽ là một trong những trường hợp mà loại điều này trở nên cần thiết. Tiếp tục. ;) –

1

Nếu sử dụng pivot table, bạn phải đảm bảo tất cả các cột "Tùy chọn" bạn có cùng kiểu dữ liệu và thời gian.

tôi sẽ đề nghị các câu trả lời sau đây:


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 

Bạn chỉ cần phải sửa đổi các @table bằng cách đặt tên bảng của bạn và danh sách các cột mà bạn cần trước khi insret vào @ cột.

Không có vấn đề gì loại dữ liệu bạn đang có, nó sẽ làm việc tốt.

Các vấn đề liên quan