将行值转换为列

时间:2012-12-18 20:08:48

标签: sql sql-server-2008 pivot

我有一张桌子:

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

对于每个用户,它包含它们的时间(StatusCategory)

  • 富有成效
  • 非生产性
  • 未知

(fyi ...状态持续时间以秒为单位)

这是唯一的3个值。

为了在使用JOIN到其他表的报告中使用此数据,我需要将该数据复制到此表中:

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

这将在每列中包含StatusDuration列中相应值的StatusDuration列中的值。

我无法弄清楚如何使用SQL Server 2008R2编写SQL代码。非常感激您的帮忙。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

无需将此数据存储在表格中,您可以轻松创建PIVOT数据到您需要的列中的视图:

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