2009-10-16 36 views
8

Vì vậy, tôi đã tìm kiếm xung quanh và tôi đã tìm thấy những thứ tương tự như vấn đề của tôi, nhưng tôi cần thêm trợ giúp để có được một giải pháp thực sự.cách chọn cột làm hàng?

Tôi đang cố gắng tạo truy vấn trả về 2 cột dữ liệu, cột đầu tiên phải là danh sách tên cột và cột thứ hai phải là giá trị của cột đó.

Nhìn bề ngoài nó sẽ trông như thế này

Column1  Column2 
-------  ------- 
columnA  value_of_columnA 
columnB  value_of_columnB 
...   ... 

Tôi khá chắc chắn rằng điều này sẽ đòi hỏi SQL động để đạt được, nhưng tôi không có ý tưởng làm thế nào để thậm chí bắt đầu tạo truy vấn.

Mọi trợ giúp đều được đánh giá cao!

+0

Câu hỏi của bạn thiếu bất kỳ chi tiết thực sự nào - bạn đang xử lý (các) bảng nào và các kiểu dữ liệu cột là gì? Phiên bản của SQL Server quá, xin. –

+1

phiên bản nào của SQL Server cụ thể? Và bạn có đang đếm chỉ có 1 hàng dữ liệu hay cột 1 sẽ là tên cột và tất cả các cột khác là dữ liệu cho cột đó? –

+0

Tôi có thể hiểu muốn xoay các hàng thành các cột, nhưng các cột thành các hàng? Bạn đang thực sự cố gắng làm gì? –

Trả lời

5

này nên làm việc cho bất kỳ bảng, nhưng trong ví dụ của tôi, tôi chỉ cần tạo một thử nghiệm một. Bạn cần đặt tên bảng trong @YourTableName. Ngoài ra, bạn cần phải đặt @YourTableWhere để giới hạn kết quả thành một hàng, nếu không kết quả đầu ra sẽ lạ với nhiều hàng được trộn lẫn với nhau.

thử điều này:

BEGIN TRY 
CREATE TABLE YourTestTable 
(RowID  int primary key not null identity(1,1) 
,col1  int null 
,col2  varchar(30) 
,col3  varchar(20) 
,col4  money 
,StatusValue char(1) 
,xyz_123  int 
) 
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (1234,'wow wee!','this is a long test!',1234.56,'A',98765) 
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (543,'oh no!','short test',0,'I',12) 

END TRY BEGIN CATCH END CATCH 

select * from YourTestTable 


DECLARE @YourTableName varchar(1000) 
DECLARE @YourTableWhere varchar(1000) 
DECLARE @YourQuery  varchar(max) 

SET @YourTableName='YourTestTable' 
set @YourTableWhere='y.RowID=1' 

SELECT 
    @YourQuery = STUFF(
         (SELECT 
          ' UNION ' 
          + 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'') 
          FROM INFORMATION_SCHEMA.COLUMNS 
          WHERE table_name = @YourTableName 
          FOR XML PATH('') 
         ), 1, 7, '' 
        ) 

PRINT @YourQuery 

EXEC (@YourQuery) 

OUTPUT:

RowID  col1  col2       col3     col4     StatusValue xyz_123 
----------- ----------- ------------------------------ -------------------- --------------------- ----------- ----------- 
1   1234  wow wee!      this is a long test! 1234.56    A   98765 
2   543   oh no!       short test   0.00     I   12 

SELECT 'RowID', CONVERT(varchar(max),RowID) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col1', CONVERT(varchar(max),col1) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col2', CONVERT(varchar(max),col2) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col3', CONVERT(varchar(max),col3) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col4', CONVERT(varchar(max),col4) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'StatusValue', CONVERT(varchar(max),StatusValue) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'xyz_123', CONVERT(varchar(max),xyz_123) FROM YourTestTable y WHERE y.RowID=1 

----------- ------------------------ 
col1  1234 
col2  wow wee! 
col3  this is a long test! 
col4  1234.56 
RowID  1 
StatusValue A 
xyz_123  98765 

EDIT

Đối với khả năng tương thích SQL Server 2000, bạn sẽ có thể thay thế varchar (max) với varchar (8000) và sử dụng tùy chọn này thay cho truy vấn SELECT @YourQuery từ mã ở trên:

SELECT 
    @YourQuery=ISNULL(@YourQuery+' UNION ','') 
     + 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'') 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = @YourTableName 
+0

Điều này trông giống như chính xác những gì tôi cần ... ngoại trừ ... Tôi đang sử dụng cơ sở dữ liệu MSSQL 2000, do đó, varchar (max) không hoạt động * mặc dù tôi đã nhận được rằng với varchar (1000) và FOR XML PATH ('') cũng không hoạt động. Tôi không chắc chắn làm thế nào để có được xung quanh một ... – Shaded

2
select column_name,* from information_schema.columns 
where table_name = 'TheTableName' 
order by ordinal_position 
0

Bạn luôn có thể làm một cái gì đó như thế này

SELECT 'Column_Name' AS ColumnName, 
    (SELECT TOP 1 Column_Name FROM Table tbl2 WHERE tbl.ID = tbl2.ID) 
FROM Table tbl 
0

My answer to this question sẽ làm việc dễ dàng hơn với SQL Server 2000 bởi vì nó không sử dụng các tính năng XML của SQL Server 2005.

0

Bạn không phải là rất rõ ràng về cách bạn đang trình bày báo cáo của bạn và những gì bạn đang tạo ra nó với. Bạn có đang sử dụng kết quả trực tiếp từ công cụ truy vấn để tạo "báo cáo" của mình không? Trong trường hợp đó, bạn sẽ cố gắng đập móng tay bằng tuốc nơ vít. Sử dụng các công cụ thích hợp cho công việc.

Không thể sử dụng ngôn ngữ SQL trực tiếp để thiết lập dữ liệu bản trình bày của bạn để tạo báo cáo. Thực sự, đó là một ý tưởng ngớ ngẩn. Thực tế là bạn có thể viết báo cáo với các câu lệnh SQL thẳng lên không có nghĩa là bạn nên.

Bạn thực sự phải tạo báo cáo của mình bằng chương trình ứng dụng mà bạn tự viết hoặc công cụ tạo báo cáo như Crystal Reports.

Chương trình ứng dụng do chính bạn viết: Nếu bạn đang sử dụng đối tượng con trỏ để truy vấn cơ sở dữ liệu, bạn có thể chỉ cần lấy tên cột từ đối tượng con trỏ đó. Đã giải quyết được sự cố.

Báo cáo Công cụ tạo: thường chúng cung cấp cơ sở để thể hiện dữ liệu động có thể xuất hiện.

Dù bằng cách nào, tôi nghĩ bạn cần phải suy nghĩ lại cách tiếp cận của bạn.

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