2009-10-16 21 views
8

Por lo tanto, he estado buscando y he encontrado cosas similares a mi problema, pero necesito más ayuda para obtener una solución real.cómo seleccionar columnas como filas?

Estoy tratando de construir una consulta que devolverá 2 columnas de datos, la primera columna debe ser una lista de los nombres de columna a sí mismos y el segundo debe ser el valor de esa columna.

Visualmente se vería así

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

Estoy bastante seguro de que esto va a requerir SQL dinámico de lograr, pero no tengo ni idea de cómo incluso comenzar a crear la consulta.

¡Se agradece cualquier ayuda!

+0

Su pregunta carece de detalles reales: ¿con qué tabla (s) está tratando y cuáles son los tipos de datos de columna? Versión de SQL Server también, pls. –

+1

¿qué versión de SQL Server específicamente? ¿Y está contando con solo tener una fila de datos, o la Columna 1 será el nombre de la columna y todas las demás columnas los datos de esa columna? –

+0

¿Puedo entender el deseo de pivotar filas en columnas, pero columnas en filas? ¿Qué estás tratando de hacer? –

Respuesta

5

Esto debería funcionar para cualquier tabla, pero en mi ejemplo que acabo de crear una prueba uno. Debes establecer el nombre de la tabla dentro de @YourTableName. Además, debe establecer @YourTableWhere para limitar los resultados a una fila, de lo contrario, la salida se ve extraña con varias filas mezcladas.

probar esto:

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) 

SALIDA:

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 

EDITAR

Para la compatibilidad de SQL Server 2000, debe ser capaz de reemplazar varchar (max) con varchar (8000) y utilizar esto en lugar de la consulta SELECT @YourQuery del código anterior:

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

Esto parece exactamente lo que necesito ... excepto ... Estoy usando la base de datos MSSQL 2000, por lo que varchar (max) no funciona * aunque logré eso con varchar (1000) y FOR XML PATH ('') tampoco funciona. No estoy seguro de cómo solucionarlo ... – Shaded

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

Siempre se puede hacer algo como esto

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 va a funcionar más fácilmente con SQL Server 2000, ya que no utiliza las funciones de XML de SQL Server 2005.

0

Usted no es muy clara acerca de cómo se está presentando su informe y lo que eres generándolo con. ¿Estás usando resultados directos de la herramienta de consulta para generar tu "informe"? En cuyo caso, creo que estás tratando de golpear una uña con un destornillador. Use la herramienta correcta para el trabajo.

El lenguaje SQL, directamente, no se debe utilizar para configurar sus datos de presentación para generar el informe. Realmente, es una idea tonta. El hecho de que usted puede escribir un informe con las sentencias SQL recta-up no significa que usted debe .

que realmente debería generar su informe usando un programa de aplicación que escriba usted mismo, o una herramienta de generación de informes como Crystal Reports.

Programa de aplicación escrito por usted mismo: Si está utilizando un objeto de cursor para consultar la base de datos, simplemente puede obtener los nombres de columna de ese objeto de cursor. Problema resuelto.

herramienta de generación de informe: por lo general proporcionan una facilidad para representar los datos dinámicos que podrían aparecer.

De cualquier manera, creo que debe reconsiderar su enfoque para esto.

Cuestiones relacionadas