Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 返回多行的子查询_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 返回多行的子查询

Sql 返回多行的子查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这件事我已经捅了一段时间了。查看fe选项以显示以下结果集。要显示ProdOp,OpSUM,然后是PCT,我们将从总时间减去t.opcode LL得到它。 这是漫长的一天,我想可能是因为SUB不能返回多行?如果没有其他的方法?交叉连接 预期结果PCT与实际百分比我们从TimeSUM查询中获得百分比,即7:59,然后除以每个OpSUM ProdOp OpSUM PCT BB 0:20 4.2% DF 1:15 15.6% HF 0:10 2.1% HR

这件事我已经捅了一段时间了。查看fe选项以显示以下结果集。要显示ProdOp,OpSUM,然后是PCT,我们将从总时间减去t.opcode LL得到它。 这是漫长的一天,我想可能是因为SUB不能返回多行?如果没有其他的方法?交叉连接

预期结果PCT与实际百分比我们从TimeSUM查询中获得百分比,即7:59,然后除以每个OpSUM

ProdOp  OpSUM PCT
BB      0:20  4.2%
DF      1:15  15.6%
HF      0:10  2.1%
HR      0:25  5.2%
JT      0:14  2.9%
MM      0:27  5.6%
NW      0:39  8.1%
PE      0:21  4.4%
PX      0:45  9.4%
SP      2:52  35.9%
SS      0:31 6.5%
当前方法

AssociateInfo样本数据


我的计算结果不同,但我认为它们是正确的——我用excel数据透视表检查了它们,以获得总计的百分比。试试这个:

SELECT 
    OpCode,
    convert(varchar, dateadd(s,sum(datediff(second,StartTime,FinishTime)), 0), 114),
    SUM(datediff(second, StartTime, FinishTime)) * 100.0 / convert(decimal, t.total)
FROM 
    MaintTimeLog
    CROSS JOIN (SELECT SUM(datediff(second,StartTime,FinishTime)) as total FROM MaintTimeLog) t
GROUP BY
    OpCode,
    t.total

convert函数本身使用dateadd函数,仅用于格式化结果。您最初尝试对格式化结果的组件进行数学计算,而此版本使用convert函数以格式化值的形式返回结果,而不修改基础值。格式114指定了所需的日期格式。

@Alan我会给你全额积分。我玩弄了你的方法,并且能够准确地生产出我想要的东西。我之所以要使用下面的日期-时间格式,是出于清晰的报告原因。我感谢你在这方面的帮助。我最初认为某个地方需要交叉连接。再次感谢和干杯

DECLARE 
    @Start     DATETIME    ,
    @End       DATETIME    ,
    @Offset    INT         
SET @Offset    = 3
SET @Start     = dateadd(day, datediff(day, 0, getdate()), -@Offset)
SET @End       = dateadd(day, datediff(day, 0, getdate()), -@Offset)

SELECT 
    ProdOp = OpCode,
    OpSUM  =  right(convert(varchar(9),(sum(datediff(second,StartTime,FinishTime)) / 3600 )),3) + ':' 
             + right('0' + convert(varchar(2),(sum(datediff(second,StartTime,FinishTime)) / 60) % 60 ),2),
    PCT    = cast(cast(SUM(datediff(second, StartTime, FinishTime)) * 100.0 / convert(decimal, t.total)as decimal(10,1)) as varchar(5)) + ' %'

FROM 
    MaintTimeLog
    CROSS JOIN (SELECT SUM(datediff(second,StartTime,FinishTime)) as total FROM MaintTimeLog where EventDate >= @Start and EventDate <= @End  and ID = 57524  and OpCode <> 'll') t
 where EventDate >= @Start and EventDate <= @End  and ID = 57524 and OpCode <> 'll'   
GROUP BY
    OpCode,
    t.total


ProdOp  OpSUM   PCT
BB      0:20    4.2 %
DF      1:15    15.7 %
HF      0:10    2.1 %
HR      0:25    5.2 %
JT      0:14    2.9 %
MM      0:27    5.6 %
NW      0:39    8.1 %
PE      0:21    4.4 %
PX      0:45    9.4 %
SP      2:52    35.9 %
SS      0:31    6.5 %  

看到一些示例数据和预期结果可能会有所帮助。显示了预期结果…添加了一些示例数据。干杯@DruidUID只是建议将示例数据脚本化到带有表DDL的insert语句中。那真的会加快速度answer@DmitrijKultasev作为INSERT语句添加的示例数据。干杯你期望的结果只是一个百分号?请更新预期结果,并按照Dmitrij的建议,添加表DDLs CREATE table…Tully只需在除数上使用sumsumt.total,而不需要所有额外的交叉连接。是的,先生@我从来没有用过over子句。这真是太棒了!谢谢你的演示。
INSERT INTO [dbo].[AssociateInfo]([ID],[FirstName]) VALUES
('57524', 'R')
SELECT 
    OpCode,
    convert(varchar, dateadd(s,sum(datediff(second,StartTime,FinishTime)), 0), 114),
    SUM(datediff(second, StartTime, FinishTime)) * 100.0 / convert(decimal, t.total)
FROM 
    MaintTimeLog
    CROSS JOIN (SELECT SUM(datediff(second,StartTime,FinishTime)) as total FROM MaintTimeLog) t
GROUP BY
    OpCode,
    t.total
DECLARE 
    @Start     DATETIME    ,
    @End       DATETIME    ,
    @Offset    INT         
SET @Offset    = 3
SET @Start     = dateadd(day, datediff(day, 0, getdate()), -@Offset)
SET @End       = dateadd(day, datediff(day, 0, getdate()), -@Offset)

SELECT 
    ProdOp = OpCode,
    OpSUM  =  right(convert(varchar(9),(sum(datediff(second,StartTime,FinishTime)) / 3600 )),3) + ':' 
             + right('0' + convert(varchar(2),(sum(datediff(second,StartTime,FinishTime)) / 60) % 60 ),2),
    PCT    = cast(cast(SUM(datediff(second, StartTime, FinishTime)) * 100.0 / convert(decimal, t.total)as decimal(10,1)) as varchar(5)) + ' %'

FROM 
    MaintTimeLog
    CROSS JOIN (SELECT SUM(datediff(second,StartTime,FinishTime)) as total FROM MaintTimeLog where EventDate >= @Start and EventDate <= @End  and ID = 57524  and OpCode <> 'll') t
 where EventDate >= @Start and EventDate <= @End  and ID = 57524 and OpCode <> 'll'   
GROUP BY
    OpCode,
    t.total


ProdOp  OpSUM   PCT
BB      0:20    4.2 %
DF      1:15    15.7 %
HF      0:10    2.1 %
HR      0:25    5.2 %
JT      0:14    2.9 %
MM      0:27    5.6 %
NW      0:39    8.1 %
PE      0:21    4.4 %
PX      0:45    9.4 %
SP      2:52    35.9 %
SS      0:31    6.5 %