Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server条件小计查询_Sql Server_Subtotal - Fatal编程技术网

Sql server SQL Server条件小计查询

Sql server SQL Server条件小计查询,sql-server,subtotal,Sql Server,Subtotal,鉴于下表: create table #T ( user_id int, project_id int, datum datetime, status varchar(10), KM int ) insert into #T values (1, 1, '20160301 10:25', 'START', 1000), (1, 1, '20160301 10:28', 'PASS', 1008), (

鉴于下表:

    create table #T
    (
    user_id int,
    project_id int,
    datum datetime,
    status varchar(10),
    KM int
    )

insert into #T values 
    (1, 1, '20160301 10:25', 'START', 1000), 
    (1, 1, '20160301 10:28', 'PASS', 1008), 
    (2, 2, '20160301 10:29', 'START', 2000),
    (1, 1, '20160301 11:08', 'STOP', 1045), 
    (3, 3, '20160301 10:25', 'START', 3000),
    (2, 2, '20160301 10:56', 'STOP', 2020), 
    (1, 4, '20160301 15:00', 'START', 1045), 
    (4, 5, '20160301 15:10', 'START', 400), 
    (1, 4, '20160301 15:10', 'PASS', 1060), 
    (1, 4, '20160301 15:20', 'PASS', 1080), 
    (1, 4, '20160301 15:30', 'STOP', 1080), 
    (4, 5, '20160301 15:40', 'STOP', 450),
    (3, 3, '20160301 16:25', 'STOP', 3200)
我必须对给定用户和项目的开始和停止状态之间的轨道长度求和 预期结果如下:

    user_id     project_id  datum      TOTAL_KM
----------- ----------- ---------- -----------
1           1           2016-03-01 45
1           4           2016-03-01 35
2           2           2016-03-01 20
3           3           2016-03-01 200
4           5           2016-03-01 50
如何在不使用集群的情况下实现这一点? 性能是一个问题(我每月有100多万条记录,我们必须将数据保存几年)

说明: 我们可以忽略状态为“通过”的记录。基本上,我们必须从给定用户和项目的停止记录中减去开始记录的KM值。 在开始和停止之间可能有几百条记录(如示例数据中所述) 日期应为开始日期(如果我们有超过午夜的交货)

我想我应该有一个带有OVER()子句的SELECT,但我不知道如何表达我的查询来满足这些条件


有什么想法吗?

这可以通过简单的自连接来实现

其中一个例子:(这可能不是确切的查询,但只是一个想法)

输出:

user_id     project_id  datum      KM
----------- ----------- ---------- -----------
1           1           2016-03-01 45
1           4           2016-03-01 35
2           2           2016-03-01 20
3           3           2016-03-01 200
4           5           2016-03-01 50

(5 row(s) affected)

您正在使用哪个版本的SQL Server?如果您只查找已完成的旅行,可能最好执行内部联接。这不是一个在任何数据库方言中都能正常工作的SQL查询:-(@Gabor,正如我已经说过的,这是一个概念性的想法,而不是你想要的确切的工作结果,所以投入的意义仅仅是因为你希望得到确切的查询。
SELECT  t.[user_id],
        t.project_id,
        cast(t.datum as date) as datum,
        t1.KM- t.KM as KM
FROM #T t
INNER JOIN #T t1 
    ON t.[user_id]=t1.[user_id] and t.project_id = t1.project_id 
WHERE t.[status] = 'START' and t1.[status] = 'STOP'
ORDER BY t.[user_id],
        t.project_id,
        cast(t.datum as date)
user_id     project_id  datum      KM
----------- ----------- ---------- -----------
1           1           2016-03-01 45
1           4           2016-03-01 35
2           2           2016-03-01 20
3           3           2016-03-01 200
4           5           2016-03-01 50

(5 row(s) affected)