Tsql 使用带有groupby的CASE

Tsql 使用带有groupby的CASE,tsql,group-by,case,Tsql,Group By,Case,我在T-SQL中有以下查询: SELECT dbo.table2.device, dbo.table2.CREATETIME AS create_time, CASE WHEN dbo.table1.ACTIONID = 1 THEN dbo.table1.startstop END AS start_time, CASE WHEN dbo.table1.ACTIONID = 2 THEN dbo.table1.start

我在T-SQL中有以下查询:

SELECT dbo.table2.device, 
    dbo.table2.CREATETIME AS create_time,
    CASE WHEN dbo.table1.ACTIONID = 1 
        THEN dbo.table1.startstop 
    END AS start_time,
    CASE WHEN dbo.table1.ACTIONID  = 2 
        THEN dbo.table1.startstop 
    END AS stop_time,
    dbo.table2.collect_time
FROM dbo.table2
JOIN dbo.table1 ON dbo.table1.CREATETIME = dbo.table2.CREATETIME;
…这给了我一个包含多行的结果表,每一行都有一个重复的开始时间-结束时间(sql时间-为简单起见缩短)-另一行为空-例如:

device | create_time | start_time | stop_time | collect_time
1      | 0000001     | 0000001    | NULL      | 0000001
1      | 0000001     | NULL       | 0000002   | 0000001
我想将这两行(以create_time作为ID)分组,以便将它们放在一行中。。。。谢谢

您可以聚合(
SUM
)这些列:

SELECT dbo.table2.device, 
    dbo.table2.CREATETIME AS create_time,
    SUM(CASE WHEN dbo.table1.ACTIONID = 1 
        THEN dbo.table1.startstop ELSE 0
    END) AS start_time,
    SUM(CASE WHEN dbo.table1.ACTIONID  = 2 
        THEN dbo.table1.startstop ELSE 0
    END) AS stop_time,
    dbo.table2.collect_time
FROM dbo.table2
JOIN dbo.table1 ON dbo.table1.CREATETIME = dbo.table2.CREATETIME
GROUP BY dbo.table2.device, dbo.table2.CREATETIME, dbo.table2.collect_time;

此外,我认为使用子查询也会奏效

SELECT
X.Device
,sum(X.start_time)
,sum(X.stop_time)
,X.collect_time
from(
SELECT dbo.table2.device, 
    dbo.table2.CREATETIME AS create_time,
    CASE WHEN dbo.table1.ACTIONID = 1 
        THEN dbo.table1.startstop 
    END AS start_time,
    CASE WHEN dbo.table1.ACTIONID  = 2 
        THEN dbo.table1.startstop 
    END AS stop_time,
    dbo.table2.collect_time
FROM dbo.table2
JOIN dbo.table1 ON dbo.table1.CREATETIME = dbo.table2.CREATETIME) AS X
group by
X.Device, X.collect_time

我可能会比较这两个版本的性能。。。谢谢你的意见!