我认为对于这种结果我必须使用联合,但问题是我不知道列数。这就是为什么我将无法使用联合。
问问题
86 次
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:
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 回答