2013-04-04 56 views
1

enter image description here如何编写将导致以下格式的查询?

我认为这种结果我不得不使用工会 但问题是,我不知道columns.That的数量,为什么我就不能使用联盟。

+0

你的模式是什么样的?哪个RDBMS?看起来你想在这里试试'UNPIVOT'。那是对的吗? – 2013-04-04 06:55:00

+0

看起来您需要构建动态的UNPIVOT脚本。 – ljh 2013-04-04 06:56:10

+0

它的Sql Server 2008.我对UnPivot没有太多的想法。 – 2013-04-04 06:56:28

回答

0

它看起来像你试图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 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 | 
+1

@BF,这还不完全动态。就像如果表emptable有另一列[MgrID int],那么该列将不会是透视。而且我们知道,unpivot列必须是相同的数据类型和长度,因此,需要动态检查列数据类型定义,dynmaic转换为相同的varchar长度。 – ljh 2013-04-04 15:34:58

0

你可以创建一个动态的Pivot SQL查询。通常动态查询是不好的,但有时他们不能得到帮助。你应该考虑改变你的数据库结构,如果你不知道有多少列中显示,你突然发布某人的个人信息无意中......

深入细节与更多类似的话题都可以在这里找到: SQL Pivot Query with Dynamic Columns

+0

我已经创建了一个动态数据透视查询,但这不会帮助我。 – 2013-04-04 06:59:43

0

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 
+0

但您在编写此查询之前必须知道列名称。 – 2013-04-04 07:46:29

+1

在哪种情况下,你无法知道你的表模式,无法知道你的表名。如果你不知道表模式,例如没有查看表DDL的权限,那么你就没有办法从类别视图中获取它。如果你已经知道你的表模式,为什么你需要动态unpivot,它更复杂,一切都是成本驱动的。 – ljh 2013-04-04 15:38:36

相关问题