如何编写将导致以下格式的查询?

时间:2013-04-04 06:51:39

标签: sql sql-server sql-server-2008 unpivot

enter image description here

我认为对于这种结果我必须使用联合 但问题是我不知道列数。这就是我无法使用Union的原因。

3 个答案:

答案 0 :(得分:0)

您可以创建动态Pivot SQL查询。通常动态查询很糟糕,但有时它们无法得到帮助。如果您不知道要显示多少列,您应该考虑更改数据库结构,突然间您无意中发布了某些个人详细信息...

可以在此处找到更详细的类似主题: SQL Pivot Query with Dynamic Columns

答案 1 :(得分: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

答案 2 :(得分: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 |