我认为对于这种结果我必须使用联合 但问题是我不知道列数。这就是我无法使用Union的原因。
答案 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:
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 |