2013-03-01 21 views
1

我搜索並不能找到一個解決方案,這恰好符合我的需要,我也可以找到一個我可以修改。我有一個數據庫表,爲了簡單起見,我們會說它有三列(packageID,carriersequence)。對於任何包裹,可以有一個或多個承運人處理包裹。我可以這樣做拼合可變長度DB行成一列

SELECT packageID, carrier 
FROM packageFlow 
ORDER BY sequence 

查詢來獲取所有已處理的包看起來像人的名單:

packageID, carrier 
1, Bob 
1, Jim 
1, Sally 
1, Ron 
2, Reggie 
2, Mary 
2, Bruce 

我需要的不過是獲得的結果爲行,看起來像:

packageID|carrier1|carrier2|carrier3|carrier4 
    1  |Bob  |Jim  |Sally |Ron 
    2  |Reggie |Mary |Bruce 

樞軸似乎並沒有做什麼,我需要的,因爲我沒有任何聚集,我不能得到一個CTE正常工作的。我很感激任何向正確方向推動。

+0

你應該告訴我們您正在使用的RDBMS。 Oracle'LEAD'有助於這種事情。 – Marc 2013-03-01 16:31:46

+1

duplicate http://stackoverflow.com/questions/5031204/does-t-sql-have-an-aggregate-function-to-concatenate-strings? – mdn 2013-03-01 16:32:03

+0

你沒有指定大多數DMBS一個DBMS但[這個答案](http://stackoverflow.com/questions/10791247/sql-server-possible-pivot-solution/10796492#10796492)的解決方案。 – GarethD 2013-03-01 16:48:56

回答

2

該數據轉換是PIVOT。從SQL Server 2005開始,有一個將行轉換爲列的函數。

如果你有一個已知數量的值,那麼你可以硬編碼查詢:

select * 
from 
(
    select packageid, carrier, 
    'Carrier_'+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col 
    from packageflow 
) src 
pivot 
(
    max(carrier) 
    for col in (Carrier_1, Carrier_2, Carrier_3, Carrier_4) 
) piv 

SQL Fiddle with Demo

如果你有一個未知的數字要變成列Carrier值,那麼你可以使用動態SQL:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(t.col) 
        from 
        (
         select 'Carrier_'+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col 
         from packageFlow 
        ) t      
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT packageid,' + @cols + ' from 
      (
       select packageid, carrier, 
        ''Carrier_''+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col 
       from packageflow 
      ) x 
      pivot 
      (
       max(carrier) 
       for col in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

注:您將取代兩個查詢的order by packageidorder by sequence

結果是:

| PACKAGEID | CARRIER_1 | CARRIER_2 | CARRIER_3 | CARRIER_4 | 
------------------------------------------------------------- 
|   1 |  Bob |  Jim |  Sally |  Ron | 
|   2 | Reggie |  Mary |  Bruce | (null) | 
+0

太棒了!謝謝,我在使用數據透視表的聚合部分中得​​到了太多的結果,並且無法通過它。 – dsvick 2013-03-01 17:43:50

+0

@dsvick我很高興你能工作,總是樂於幫忙! :) – Taryn 2013-03-01 17:45:11

+0

@bluefeet轉移堆棧溢出到更明亮的明天。 – Zane 2013-03-01 18:17:09