2013-03-14 59 views
2

我有一個被稱爲SectionNames如因此,對如下根據表列動態合併兩列或多列?

SectionID SectionCode  Subsection 
    1   xYz   Individual 
    2   xYz   Family 
    3   CYD   Friends 
    4   PCPO  level1 
    5   PCPO  level2 
    6   PCPO  level3

表。因此,將來我們可以爲每個部分代碼添加一個或多個子部分。

另外還有一張表,這是上面SectionNames表和Employee表的員工數據參考表。

ID EmployeeID SectionID Cost  
1   1    1 $200 
2   1    2 $300  
3   1    3 $40 
4   1    4 $10 
5   1    5 No Level 
6   1    6 No Level 
7   1    7 $20 
8   1    8 No Level 
9   1    9 No Level

所以Iwant了出來,從這些表把應該是這樣的:

EmployeeID  Individual_xyz_Cost Family_xyz_Cost Friends_xyz_cost level1_PCPO_cost level2_PCPO_Cost 
    1     $200     $300    $400    $10    NoLevel 

很少有員工記錄存在於我的員工表。我希望這是動態的。如果將來如果爲XYZ部分添加了另一個子部分Relatives,那麼我的查詢應返回Relatives_XYZ_Cost

如何動態地寫這個查詢?

回答

6

您將需要使用PIVOT函數將列中的數據轉換爲行。如果你將有一個未知數量的值需要是列,那麼你將需要使用動態SQL。

首先查看靜態或硬編碼版本,然後將其轉換爲動態SQL版本更容易。

select * 
from 
(
    select e.employeeid, 
    s.subsection +'_'+s.sectioncode+'_Cost' Section, 
    e.cost 
    from employee e 
    inner join sectionnames s 
    on e.sectionid = s.sectionid 
) src 
pivot 
(
    max(cost) 
    for section in (Individual_xYz_Cost, Family_xYz_Cost, 
        Friends_CYD_Cost, level1_PCPO_Cost, 
        level2_PCPO_Cost, level3_PCPO_Cost) 
) piv; 

SQL Fiddle with Demo:當你有一個已知數值的靜態版本使用。

如果您需要查詢的是靈活的,那麼你將其轉換爲使用動態SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(subsection +'_'+sectioncode+'_Cost') 
        from SectionNames 
        group by subsection, sectioncode, sectionid 
        order by sectionid 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT employeeid,' + @cols + ' 
       from 
      (
       select e.employeeid, 
        s.subsection +''_''+s.sectioncode+''_Cost'' Section, 
        e.cost 
       from employee e 
       inner join sectionnames s 
        on e.sectionid = s.sectionid 
      ) x 
      pivot 
      (
       max(cost) 
       for section in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

共同作用的結果是:

| EMPLOYEEID | INDIVIDUAL_XYZ_COST | FAMILY_XYZ_COST | FRIENDS_CYD_COST | LEVEL1_PCPO_COST | LEVEL2_PCPO_COST | LEVEL3_PCPO_COST | 
---------------------------------------------------------------------------------------------------------------------------------- 
|   1 |    $200 |   $300 |    $40 |    $10 |   No Level |   No Level | 
+0

該作品像魅力......你是如此快速的人......感謝很多。 – user1882705 2013-03-14 16:31:07

+0

我可以如下使用這個動態結果集來加入一些其他表:內部連接(結果集)AS z ON z.ID = b.ID – user1882705 2013-03-14 18:10:31

+0

@ user1882705是的,你可以擴展sql字符串以將此select子查詢 – Taryn 2013-03-14 18:18:14