2013-04-04 19 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

相關問題