0

我有一张桌子:

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

这包含,对于每个用户,他们有多少时间(StatusCategory)

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

(仅供参考...状态持续时间以秒为单位)

这些是仅有的 3 个值。

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

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

这将在每一列中包含 StatusDuration 列中对应于 StatusCategory 列中的值的值。

我不知道如何使用 SQL Server 2008R2 编写 SQL 代码来做到这一点。非常感激你的帮助。

4

2 回答 2

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
于 2012-12-18T20:14:18.487 回答
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
于 2012-12-18T20:18:21.120 回答