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