2012-12-18 54 views
0

我有一個表:轉換行值成列

CREATE TABLE StatusStats (
    UserID  VARCHAR(50), 
    StatusCategory VARCHAR(50), 
    StatusDuration INT 
) 

包含,爲每個用戶,他們有多少時間是(StatusCategory)

  • 生產
  • 非生產性
  • 未知

(fyi ... status du日糧以秒計)

這些是唯一的3個值。

爲了使用報告使用該數據相結合其他表,我需要複製,在此表中的數據:

CREATE TABLE StatusStatsByUser (
    UserID  VARCHAR(50), 
     Productive  INT, 
     NonProductive INT, 
     Unknown   INT 
) 

這將在每列包含在該StatusDuration列中的值獲取StatusCategory列中的相應值。

我無法弄清楚如何編寫SQL代碼來做到這一點,使用SQL Server 2008R2。非常感激你的幫助。

+0

你有沒有檢討[許多問題(http://stackoverflow.com/search?q=sql+rows+to+columns )在這個網站上將行轉換爲列?你到目前爲止嘗試過什麼? – Pondlife

+0

@Pondlife我看到了一些,但他們都處理動態數量的列。我雖然靜態會更容易。 – Amarundo

回答

1

沒有必要在表中存儲這些數據,您可以輕鬆地創建一個視圖,PIVOT S中的數據轉換成你所需要的列:

CREATE VIEW yourPivotedView 
AS 
select userid, Productive, NonProductive, Unknown 
from 
(
    select userid, StatusCategory, StatusDuration 
    from StatusStats 
) src 
pivot 
(
    sum(StatusDuration) 
    for StatusCategory in (Productive, NonProductive, Unknown) 
) piv 

一旦這是一個觀點,那麼你可以加入它與其他表:

select * 
from yourtable t1 
inner join yourPivotedView p 
    on t1.userid = p.userid 

但是如果你必須插入到一個新表,您可以使用:

insert into StatusStatsByUser (userid, Productive, NonProductive, Unknown) 
select userid, Productive, NonProductive, Unknown 
from 
(
    select userid, StatusCategory, StatusDuration 
    from StatusStats 
) src 
pivot 
(
    sum(StatusDuration) 
    for StatusCategory in (Productive, NonProductive, Unknown) 
) piv 
+0

我使用了實際插入的那個,因爲所有這些都在存儲過程中,並使用了運行時表。但是,它不工作。它只填充第一列「生產力」中的值。其他行對於所有行都是NULL。 – Amarundo

+0

等待,等等...我可能有一個錯字... – Amarundo

+0

@Amarundo你可以從你的表中發佈一些示例數據嗎?或者創建一個sql小提琴 - http://www.sqlfiddle.com/ - 與您的數據模型 – Taryn

1

也許是這樣的:

INSERT INTO StatusStatsByUser 
SELECT UserId , 
     SUM(CASE WHEN StatusCategory = 'Productive' THEN StatusDuration 
       ELSE 0 
      END) AS Productive , 
     SUM(CASE WHEN StatusCategory = 'NonProductive' THEN StatusDuration 
       ELSE 0 
      END) AS NonProductive , 
     SUM(CASE WHEN StatusCategory = 'Unknown' THEN StatusDuration 
       ELSE 0 
      END) AS Unknown 
FROM StatusStats 
GROUP BY UserId 
+0

謝謝,我用了其他答案,我只能選擇1! – Amarundo