回答
它看起来像你试图unpivot的的数据,而不是应用支点。 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 |
@BF,这还不完全动态。就像如果表emptable有另一列[MgrID int],那么该列将不会是透视。而且我们知道,unpivot列必须是相同的数据类型和长度,因此,需要动态检查列数据类型定义,dynmaic转换为相同的varchar长度。 – ljh 2013-04-04 15:34:58
你可以创建一个动态的Pivot SQL查询。通常动态查询是不好的,但有时他们不能得到帮助。你应该考虑改变你的数据库结构,如果你不知道有多少列中显示,你突然发布某人的个人信息无意中......
深入细节与更多类似的话题都可以在这里找到: SQL Pivot Query with Dynamic Columns
我已经创建了一个动态数据透视查询,但这不会帮助我。 – 2013-04-04 06:59:43
SQL FIDDLE DEMO
这是有多少列你知道你需要unpivot。
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-04 07:46:29
在哪种情况下,你无法知道你的表模式,无法知道你的表名。如果你不知道表模式,例如没有查看表DDL的权限,那么你就没有办法从类别视图中获取它。如果你已经知道你的表模式,为什么你需要动态unpivot,它更复杂,一切都是成本驱动的。 – ljh 2013-04-04 15:38:36
- 1. 如何正确编写以下查询?
- 2. 如何编写以下SQL查询?
- 3. 如何编写以下mySQL查询?
- 4. 如何为以下查询编写QueryExpression?
- 5. 如何编写一个LINQ查询,该查询将使用以下格式生成JSON字符串?
- 6. 如何在Lambda表达式中编写以下sql查询
- 7. 如何为以下查询编写关系代数表达式?
- 8. 如何在SQLite中编写查询以输出此格式?
- 9. 如何编写下面的mongo查询?
- 10. 如何编写下面的SQL查询?
- 11. 如何将以下SQL查询重写为LINQ查询?
- 12. 如何在没有子查询的情况下为以下查询编写sql
- 13. 如何编写一个mysql查询以满足以下要求?
- 14. 如何编写一个sql查询以获得以下结果?
- 15. 如何为下表编写postgres查询?
- 16. 编写MYSQL以下用户查询
- 17. 以codeigniter风格编写联合查询
- 18. 如何在SQL Server Express 2008中以可执行方式编写以下查询
- 19. 如何编写sql查询以获得下面的结果
- 20. 如何编写满足以下场景的查询/触发器?
- 21. 如何编写休眠条件查询下面的SQL查询
- 22. 如何在Yii2中编写下面的mongo查询查询
- 23. 如何将SQL查询编写为named_scope?
- 24. 需要编写一个将以下格式转换XML的XSLT
- 25. 如何从Neo4j以.rdf格式导出下面的查询响应?
- 26. 如何通过并剥离Linq查询来编写以下组?
- 27. 如何为以下SQL编写实体框架4查询?
- 28. 如何使用Eloquent在Laravel中编写以下SQL查询?
- 29. 如何为以下方案编写查询?
- 30. 如何在Rails中编写以下查询?
你的模式是什么样的?哪个RDBMS?看起来你想在这里试试'UNPIVOT'。那是对的吗? – 2013-04-04 06:55:00
看起来您需要构建动态的UNPIVOT脚本。 – ljh 2013-04-04 06:56:10
它的Sql Server 2008.我对UnPivot没有太多的想法。 – 2013-04-04 06:56:28