2012-05-17 26 views
6

Tôi có một bảng mà hiện nay trông hơi giống this-SQL - Làm cách nào để tạo bảng có các giá trị dưới dạng cột và định dạng mới?

CASEID ¦ FORMNAME ¦ NAME ¦ VALUE 

601554 ¦ CASEFORM ¦ Mond ¦ AAAA 
601554 ¦ CASEFORM ¦ Tues ¦ BBBB 
601554 ¦ CASEFORM ¦ Wedn ¦ CCCC 
601554 ¦ CASEFORM ¦ Thur ¦ DDDD 

bây giờ tôi muốn tạo ra một bảng mới trong SQL sẽ sao chép các dữ liệu và thay đổi định dạng của nó hoàn toàn như sau-

CASEID ¦ FORMNAME ¦ Mond ¦ Tues ¦ Wedn ¦ Thur 

601554 ¦ CASEFORM ¦ AAAA ¦ BBBB ¦ CCCC ¦ DDDD 

Bảng gốc có khoảng 400 dòng, vì vậy bảng mới sẽ cần 400 cột.

Kiến thức SQL của tôi chắc chắn bị giới hạn, nhưng tôi luôn có thể phạm sai lầm theo cách của tôi đến giải pháp khi tôi cần. Trong trường hợp này tuy nhiên tôi thậm chí không biết bắt đầu từ đâu. Ai đó có thể chỉ cho tôi đi đúng hướng?

+2

SQL Server, MySQL, Oracle? – MatBailie

+0

SQL Server 2008 –

+0

Chỉ muốn nói lời cảm ơn đến tất cả những người đã đăng cho đến nay. Tôi đang đọc tất cả các đề xuất của bạn. Chúc mừng. –

Trả lời

1

Bắt đầu với truy vấn này:

create table NewTable(CASEID int, FORMNAME varchar(255)) 
go 

insert into NewTable select distinct caseid,formname from OldTable 
go 

select distinct 'alter table NewTable add ' +[name]+ ' varchar(255)' from oldtable 

và sau đó sao chép các kết quả và chạy chúng.

Sau đó chạy truy vấn này:

select distinct 'update NewTable set ' +Name+ ' = ''' + Value +''' where caseid = ' +cast(caseid as varchar(20))+ 
' and FORMNAME = '''+Formname+'''' 
from oldtable 

và sau đó sao chép các kết quả và chạy chúng.

Chỉnh sửa: Thêm phiên bản tự động:

create table NewTable(CASEID int, FORMNAME varchar(255)) 
go 
insert into NewTable select distinct caseid,formname from OldTable 
go 
DECLARE @query VARCHAR(max) 
set @query = '' 
select @query = @query + 'alter table NewTable add ' +[name]+ ' varchar(255);' from (select distinct name from oldtable)c 
exec (@query) 
set @query = '' 
select @query = @query+ 'update NewTable set ' +Name+ ' = ''' + Value +''' where caseid = ' +cast(caseid as varchar(20))+ ' and FORMNAME = '''+Formname+'''' 
from (select distinct Name, Value, Caseid, FormName from OldTable)c 
exec (@query) 
+0

Điều này thực sự làm công việc hoàn toàn cảm ơn, tuy nhiên hai yếu tố thủ công đặt ra cho tôi một vấn đề như tôi cần phải tự động hóa toàn bộ quá trình được kích hoạt tự động. Bạn có biết cách tốt để làm điều này không? Tôi đang làm việc với các dịch vụ web và eForms và hy vọng sẽ kích hoạt quá trình này thông qua dịch vụ web/thủ tục lưu trữ tại thời điểm gửi eForm. –

+0

@CraigC Làm thế nào về điều đó? – Kevin

+0

Cảm ơn bạn rất nhiều vì Kevin này, và cảm ơn mọi người khác. Tôi đã làm việc trên tùy chọn này đầu tiên chỉ đơn thuần là nó dường như là đơn giản nhất về mức độ kiến ​​thức SQL của tôi. Hạnh phúc nó làm việc hoàn hảo cho những gì tôi cần và bây giờ sẽ cho phép tôi tạo sự khác biệt rất lớn cho báo cáo của tổ chức của tôi về dữ liệu eform. –

1

Bạn đang xác định một siêu mô hình.

Những gì bạn cần làm là lặp lại bảng METAMODEL và xây dựng câu lệnh ALTER tùy chỉnh cho mỗi hàng được tìm thấy tương ứng với bất kỳ định nghĩa nào của cột MODEL.

Tôi cũng thấy bạn cũng muốn chuyển đổi các giá trị. Nếu đúng như vậy, hãy xây dựng câu lệnh DML trên cùng một vòng lặp và thực thi chúng sau đó để mô hình đích của bạn kết thúc việc xây dựng.

Links:

ALTER bảng mysql: http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

con trỏ mysql: http://dev.mysql.com/doc/refman/5.0/en/cursors.html


Mặt khác, truy vấn này:

SELECT CONCAT('ALTER TABLE mytable ADD COLUMN ', t.name, ' VARCHAR(256);') FROM mytable t 

sẽ trở lại t anh ta thay đổi các câu lệnh bảng mà bạn cần thêm các cột này theo cách thủ công. Bạn có thể sử dụng mô hình này làm mô hình để tạo truy vấn tiếp theo để thêm các giá trị vào bảng của bạn sau này.

Rgds.

1

Đối với máy chủ Sql có thể muốn xem xét tính năng xoay vòng. Đây là mẫu phù hợp với kịch bản của bạn và xuất kết quả mà bạn muốn ...

declare @data table (CASEID int, FORMNAME varchar(20), NAME varchar(20), VALUE varchar(20)) 
insert into @data values 
(601554, 'CASEFORM', 'Mond', 'AAA'), 
(601554, 'CASEFORM', 'Tues', 'BBB'), 
(601554, 'CASEFORM', 'Wedn', 'CCC'), 
(601554, 'CASEFORM', 'Thur', 'DDD') 

SELECT * 
FROM @data 
PIVOT 
(
    MAX(VALUE) 
    FOR [NAME] IN ([Mond],[Tues],[Wedn],[Thur]) 
) 
AS data 
+0

Chỉ có vấn đề tôi thấy với truy vấn này là anh ta phải gõ 400 tên cột – Kevin

+0

Tại sao bạn nên loại chúng ra? Tôi muốn sử dụng tính năng Tìm kiếm và Thay thế regex của Visual Studio. Tôi sẽ cung cấp một bản cập nhật câu trả lời ... –

+0

@rs đánh bại tôi quá nó –

0

IMHO, đó là một yêu cầu thực sự lạ! Được nói rằng, những gì bạn cần là một truy vấn trục. Thông tin chi tiết có thể được tìm thấy tại Ask Tom - Pivot Query

+0

Đó là một điều kỳ lạ. Tôi đang cố gắng tách dữ liệu ra khỏi một bảng thực sự kỳ lạ trong một hệ thống thực sự kỳ lạ và cố gắng đưa nó vào một định dạng có thể sử dụng để đưa vào vũ trụ Đối tượng kinh doanh. –

1

Nếu bạn không biết chính xác số lượng cột mà bạn có thể sử dụng này:

DECLARE @columns varchar(max) 
DECLARE @query VARCHAR(max) 
SELECT @columns = COALESCE(@columns + ',[' + cast([Name] as varchar(100)) + ']', 
       '[' + cast([Name] as varchar(100))+ ']')   
    FROM @data1 

SET @query = 'SELECT * FROM @data1 ' 
SET @query = @query + '    
      PIVOT 
      (
       MAX(VALUE) FOR [NAME] IN (' + @columns + ') 
      ) 
      AS p'         

EXEC @query 
Các vấn đề liên quan