从SQL Server中的表中逐列提取数据

时间:2013-07-26 09:38:04

标签: sql-server

我目前有一段代码可以动态地插入行数据。代码如下所示:

CREATE TABLE Table1
     ([empname] varchar(6), [empqual] varchar(10), [emprank] int, [empexp] int)


INSERT INTO Table1
     ([empname], [empqual], [emprank], [empexp])
VALUES
     ('Joyce', 'UNIVERSITY', 1, 11),
     ('Angela', 'MASTERS', 2, 10),
     ('Lily', 'MASTERS', 3, 9),
     ('Sasha', 'UNIVERSITY', 3, 9),
     ('Harry', 'UNIVERSITY', 3, 9)

DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + 'Column' + CONVERT(VARCHAR,Row_Number() OVER (Order By emprank))
        FROM Table1 c
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

SET @query = '
 SELECT * 
 FROM 
 (
   SELECT ''Column'' + CONVERT(VARCHAR,Row_Number() OVER (Order By emprank)) AS Columns, 
   CONVERT(VARCHAR,empname) as e 
   FROM Table1 
 ) p
 PIVOT
 (
   MAX (e)
   FOR Columns IN
   ( 
     ' + @cols + ' )
   ) as pvt

 UNION

 SELECT * 
 FROM 
 (
   SELECT ''Column'' + CONVERT(VARCHAR,Row_Number() OVER (Order By emprank)) AS Columns, 
   CONVERT(VARCHAR,empqual) as e 
   FROM Table1 
 ) p
 PIVOT
 (
   MAX (e)
   FOR Columns IN
   ( 
     ' + @cols + ' )
   ) as pvt

 UNION

 SELECT * 
 FROM 
 (
   SELECT ''Column'' + CONVERT(VARCHAR,Row_Number() OVER (Order By emprank)) AS Columns, 
   CONVERT(VARCHAR,emprank) as e 
   FROM Table1 
 ) p
 PIVOT
 (
   MAX (e)
   FOR Columns IN
   ( 
      ' + @cols + ' )
   ) as pvt

 UNION 

 SELECT * 
 FROM 
 (
   SELECT ''Column'' + CONVERT(VARCHAR,Row_Number() OVER (Order By emprank)) AS Columns, 
   CONVERT(VARCHAR,empexp) as e, 
   FROM Table1 
 ) p
 PIVOT
 (
   MAX (e)
   FOR Columns IN
   ( 
      ' + @cols + ' )
   ) as pvt
 '
EXECUTE (@query)

上述代码的结果如下所示:

  Column1    Column2    Column3    Column4    Column5
     1          2          3          3          3
    11         10          9          9          9
   Joyce      Angela      Lily      Sasha      Harry
 UNIVERSITY   MASTERS    MASTERS  UNIVERSITY  UNIVERSITY

现在,我的应用程序要求我分别显示此表中的每个列,即此表的每个而不是行都需要从此表中导出并传输,可能进入一个临时表,从中可以很容易地显示。

我很清楚关系数据库是以这样的方式设计的,以便将行而不是列视为单独的实体。但是,我受到我正在使用的应用程序的限制,这需要代码以列方式提取此表中的数据,以便它们可以单独显示。

我将如何做到这一点?

1 个答案:

答案 0 :(得分:0)

这是术语重叠。

  • 在SQL中,“row”表示(大致)单个实体,“column”表示实体上的属性。
  • 在UI中,“行”表示水平排列的数据,“列”表示垂直排列的数据。

您的要求是您应该垂直显示您的实体。因此,检索您的实体(SQL ),然后在您的应用程序中添加代码,以在UI 中显示此数据。这里的术语相同是不幸的,也许令人困惑,但请记住,您的数据库结构(以及术语的选择)与您的UI布局完全无关。

至于您的应用程序中需要显示数据的代码......好吧,您甚至没有告诉我们它是什么语言,所以我无法帮助那里。