2009-10-16 11 views
8

Also habe ich gesucht und ich habe ähnliche Dinge zu meinem Problem gefunden, aber ich brauche mehr Hilfe, um eine echte Lösung zu bekommen.Wie wählt man Spalten als Zeilen?

Ich versuche eine Abfrage zu erstellen, die 2 Datenspalten zurückgibt, die erste Spalte sollte eine Liste der Spaltennamen selbst sein und die zweite sollte der Wert dieser Spalte sein.

Optisch würde es so aussieht

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

Ich bin ziemlich sicher, dass diese dynamische SQL erfordern wird zu erreichen, aber ich habe keine Ahnung, wie auch die Erstellung die Abfrage beginnen.

Jede Hilfe wird geschätzt!

+0

Ihre Frage enthält keine echten Details - mit welchen Tabellen haben Sie es zu tun, und was sind die Spaltendatentypen? Version von SQL Server auch, pls. –

+1

welche Version von SQL Server speziell? Und zählen Sie darauf, nur eine Datenzeile zu haben, oder ist Spalte 1 der Spaltenname und alle anderen Spalten die Daten für diese Spalte? –

+0

Ich kann verstehen, Zeilen in Spalten zu schwenken, aber Spalten in Zeilen? Was versuchst du eigentlich? –

Antwort

5

tun Dies sollte für jeden Tisch arbeiten, aber in meinem Beispiel schaffe ich gerade einen Test ein. Sie müssen den Tabellennamen innerhalb von @YourTableName festlegen. Außerdem müssen Sie @YourTableWhere festlegen, um die Ergebnisse auf eine Zeile zu beschränken. Andernfalls sieht die Ausgabe bei mehreren miteinander gemischten Zeilen komisch aus.

versuchen Sie dies:

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

für SQL Server 2000-Kompatibilität, sollten Sie in der Lage sein, varchar (max) mit varchar zu ersetzen (8000) und verwenden Sie diese anstelle der SELECT @YourQuery Abfrage aus dem obigen Code:

+0

Das sieht genau so aus, was ich brauche ... außer ... Ich benutze die MSSQL 2000 Datenbank, also funktioniert varchar (max) nicht, obwohl ich das mit varchar (1000) und FOR XML PATH ('') funktioniert auch nicht. Ich bin mir nicht sicher, wie ich das umgehen soll ... – Shaded

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

konnte man immer so etwas wie dieses

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 wird leichter mit SQL Server 2000 arbeiten, weil es nicht die XML-Funktionen von SQL Server verwenden, ist 2005

0

Sie sind nicht ganz klar darüber, wie Sie Ihren Bericht präsentieren und was du bist Erzeuge es mit. Verwenden Sie direkte Ergebnisse aus dem Abfragetool, um Ihren "Bericht" zu generieren? In diesem Fall denken Sie, dass Sie versuchen, einen Nagel mit einem Schraubenzieher zu schlagen. Verwenden Sie das richtige Werkzeug für den Job.

Die SQL-Sprache sollte nicht direkt zum Einrichten Ihrer Präsentationsdaten zum Erstellen Ihres Berichts verwendet werden. Wirklich, es ist eine dumme Idee. Die Tatsache, dass Sie können schreiben Sie einen Bericht mit geraden SQL-Anweisungen bedeutet nicht, dass Sie sollten.

Sie sollten Ihren Bericht wirklich generieren, indem Sie ein Anwendungsprogramm verwenden, das Sie selbst schreiben, oder ein Berichterstellungstool wie Crystal Reports.

Von Ihnen geschriebenes Anwendungsprogramm: Wenn Sie ein Cursor-Objekt zum Abfragen der Datenbank verwenden, können Sie einfach die Spaltennamen von diesem Cursor-Objekt abrufen. Problem gelöst.

Berichtserstellungs-Tool: In der Regel bieten sie eine Möglichkeit zur Darstellung der dynamischen Daten, die angezeigt werden könnten.

Wie auch immer, ich denke, dass Sie Ihren Ansatz dazu überdenken müssen.

Verwandte Themen