1

在此处输入图像描述

我认为对于这种结果我必须使用联合,但问题是我不知道列数。这就是为什么我将无法使用联合。

4

3 回答 3

0

您可以创建一个动态的 Pivot SQL 查询。通常动态查询很糟糕,但有时也无济于事。如果您不知道要显示多少列,您应该考虑更改数据库结构,突然您无意中发布了某人的个人详细信息...

可以在此处找到具有更深入细节的类似主题: SQL Pivot Query with Dynamic Columns

于 2013-04-04T06:55:40.240 回答
0

SQL FIDDLE DEMO
这是您知道需要取消透视的列数。


select ID, ColumnName, ColumnValue
from (
select ID, Name, cast(Age as varchar(10)) as Age, Designation from Employee 
)P
unpivot
   (
      columnValue for ColumnName in ([Name], [Age], [Designation]) 
    ) as UP
于 2013-04-04T07:21:54.867 回答
0

看起来您正在尝试对数据进行透视而不是应用透视。UNPIVOT 函数会将您的多列转换为行。

如果您知道将拥有多少列,则可以对解决方案进行硬编码:

select emp_id, col, value
from
(
  select emp_id, name, cast(age as varchar(20)) age, d.title
  from empTable e
  inner join empDesignationTable d
    on e.designationId = d.id
) d
unpivot
(
  value
  for col in (name, age, title)
) u;

请参阅SQL Fiddle with Demo

但是如果你有未知的列,那么你将需要使用动态 SQL:

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

select @colsUnpivot = stuff((select ','+quotename(C.column_name)
         from information_schema.columns as C
         where C.table_name in ('empTable', 'empDesignationTable') and
               C.column_name not like '%id%'
         for xml path('')), 1, 1, '')

set @query 
  = 'select emp_id, col, value
     from
     (
       select emp_id, name, cast(age as varchar(20)) age, d.title
       from empTable e
       inner join empDesignationTable d
         on e.designationId = d.id
     ) d
     unpivot
     (
        value
        for col in ('+ @colsunpivot +')
     ) u'

exec(@query)

请参阅SQL Fiddle with Demo。两者都给出结果:

| EMP_ID |   COL |             VALUE |
--------------------------------------
|      1 |  name |              John |
|      1 |   age |                25 |
|      1 | title | Software Engineer |
|      2 |  name |             Smith |
|      2 |   age |                31 |
|      2 | title |       UI Designer |
于 2013-04-04T10:16:54.750 回答