2009-10-16 26 views
8

Quindi, ho cercato in giro e ho trovato cose simili al mio problema, ma ho bisogno di più aiuto per ottenere una soluzione reale.come selezionare le colonne come righe?

Sto provando a costruire una query che restituirà 2 colonne di dati, la prima colonna dovrebbe essere un elenco dei nomi delle colonne stessi e il secondo dovrebbe essere il valore di quella colonna.

Visivamente sarebbe simile a questa

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

Sono abbastanza sicuro che questo sta andando a richiedere SQL dinamico da raggiungere, ma non ho idea di come iniziare anche la creazione di query.

Qualsiasi aiuto è apprezzato!

+0

La tua domanda manca di dettagli reali: che tabella/i stai trattando e quali sono i tipi di dati della colonna? Anche la versione di SQL Server, pls. –

+1

quale versione di SQL Server in particolare? E stai contando di avere solo una riga di dati, o la colonna 1 sarà il nome della colonna e tutte le altre colonne i dati per quella colonna? –

+0

Riesco a capire di voler trasformare le righe in colonne, ma le colonne in righe? Cosa stai cercando di fare? –

risposta

5

Questo dovrebbe funzionare per qualsiasi tavolo, ma nel mio esempio ho appena creare un test uno. È necessario impostare il nome della tabella in @YourTableName. Inoltre, è necessario impostare @YourTableWhere per limitare i risultati a una riga, altrimenti l'output sembra strano con più file mescolate insieme.

provare questo:

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) 

USCITA:

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

Per la compatibilità di SQL Server 2000, si dovrebbe essere in grado di sostituire varchar (max) con varchar (8000) e utilizzare questo al posto della query SELECT @YourQuery dal codice sopra:

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

Questo mi sembra esattamente quello di cui ho bisogno ... eccetto ... Sto usando il database MSSQL 2000, quindi varchar (max) non funziona * anche se l'ho risolto con varchar (1000) e FOR XML PATH ('' ') inoltre non funziona. Non sono sicuro di come girarlo ... – Shaded

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

Si può sempre fare qualcosa di simile

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 funzionerà più facilmente con SQL Server 2000, perché non utilizza le funzionalità XML di SQL Server 2005.

0

Non siete molto chiari su come si sta presentando la sua relazione e ciò che sei generandolo con. Stai utilizzando i risultati diretti dallo strumento di query per generare il tuo "rapporto"? In tal caso, penso che tu stia cercando di battere un chiodo usando un cacciavite. Usa lo strumento giusto per il lavoro.

Il linguaggio SQL, direttamente, non deve essere utilizzato per impostare i dati di presentazione per generare il report. Davvero, è un'idea sciocca. Il fatto che tu possa scrivere scrivendo un report con istruzioni SQL diritte non significa che tu sia .

È davvero necessario generare il report utilizzando un programma applicativo che si scrive da soli o uno strumento di generazione di report come Crystal Reports.

Programma applicativo scritto dall'utente: Se si utilizza un oggetto cursore per interrogare il database, è possibile ottenere semplicemente i nomi di colonna da tale oggetto cursore. Problema risolto.

Generazione report: di solito forniscono una funzionalità per rappresentare i dati dinamici che potrebbero apparire.

In entrambi i casi, penso che sia necessario riconsiderare il proprio approccio a questo.

Problemi correlati