[英]SQL Server - Stored Procedure issue to get Matrix type of data
Need help, struggling to do this please 需要帮助,请努力进行
Got the following fields in table 在表中获得以下字段
Package_Name
Package_StartTime
Package_Endtime
What I require is: 我需要的是:
Based on data range give me how much time each package took time to execute 根据数据范围,我可以了解每个程序包执行所需的时间
like 喜欢
Package Name - 21 Sept 22 Sept 23 Sept
ABC 3 mins 4 mins 2 mins
This way I want to see the execution time pattern of the packages. 这样,我想查看程序包的执行时间模式。
Try this to get the data 试试这个来获取数据
select package_Name as Package,Package_StartTime as Start,
DateDiff(s,Package_StartTime,Package_EndTime) as Time
from table
where Package_StartTime >= @StartOfRange and Package_EndTime <= @EndOfRange
You could format the seconds to time inside SQL if you want using 如果要使用SQL,可以在SQL中格式化秒的时间
cast((DateDiff(s,Package_StartTime,Package_EndTime) / 60) as varchar(2)) +
':' + cast((DateDiff(s,Package_StartTime,Package_EndTime) % 60) as varchar(2))
This will return a result set looking like this... 这将返回结果集,如下所示:
Package Start Time
ABC 9/21/2011 360
ABC 9/22/2011 570
etc.
or 要么
Package Start Time
ABC 9/21/2011 6:00
ABC 9/22/2011 9:30
etc.
Depending on how you get the Time column 取决于您如何获取“时间”列
If you are using SQL 2005 and above, you can use PIVOT to spread this across columns... Here is a good link with an example of how to use PIVOT 如果您使用的是SQL 2005及更高版本,则可以使用PIVOT将其分布在各个列中...这是一个很好的链接,提供了有关如何使用PIVOT的示例
Quick PIVOT example, not tested, but hopefully gets you started. 快速的PIVOT示例,未经测试,但希望可以帮助您入门。
select * from PackageTableAbove
pivot (max (Time) for Start in ([9/21/2011],[9/22/2011],
[9/23/2011],[9/24/20111])) as PackageTimePerDay
If you don't want to hard-code the dates, you can look at using dynamic SQL to build the above statement. 如果您不想对日期进行硬编码,则可以考虑使用动态SQL构建上述语句。 I am using Max(Time) under the assumption each package runs once per day.
我在每个程序包每天运行一次的假设下使用Max(Time)。
For every package, this query will calculate execution time in minutes for every day between StartTime
and EndTime
. 对于每个包,此查询将计算
StartTime
和EndTime
之间每天的执行时间,以分钟为单位。
Solution: 解:
CREATE TABLE dbo.Package
(
Name NVARCHAR(10) PRIMARY KEY
,StartTime DATETIME NOT NULL
,EndTime DATETIME NOT NULL
);
INSERT dbo.Package
SELECT 'A', '2011-01-01T00:02:00', '2011-01-01T00:05:00'
UNION ALL
SELECT 'B', '2011-01-01T23:50:00', '2011-01-02T00:04:00'
UNION ALL
SELECT 'C', '2011-01-01T23:50:00', '2011-01-01T23:59:00'
UNION ALL
SELECT 'D', '2011-01-02T22:10:00', '2011-01-05T01:00:00';
WITH PivotSource
AS
(
SELECT a.Name
,CONVERT(VARCHAR(25),b.DayStartTime,112) [Day]
,DATEDIFF(MINUTE,b.DayStartTime,b.DayEndTime) DayMinutes
FROM dbo.Package a
CROSS APPLY
(
SELECT v.number
,CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112) IntermediateTime
,CASE
WHEN v.number=0 THEN a.StartTime
ELSE CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112)
END DayStartTime
,CASE
WHEN CONVERT(VARCHAR(25),a.EndTime,112)=CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112) THEN a.EndTime
ELSE CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112)+' 23:59:59.999'
END DayEndTime
FROM master.dbo.spt_values v
WHERE v.type = 'P'
AND v.number <= DATEDIFF(DAY,a.StartTime,a.EndTime)
) b
)
SELECT pvt.*
FROM PivotSource cte
PIVOT( SUM(cte.DayMinutes) FOR cte.[Day] IN ([20110101],[20110102],[20110103],[20110104],[20110105]) ) pvt
DROP TABLE dbo.Package;
Results: 结果:
Name 20110101 20110102 20110103 20110104 20110105
---------- ----------- ----------- ----------- ----------- -----------
A 3 NULL NULL NULL NULL
B 10 4 NULL NULL NULL
C 9 NULL NULL NULL NULL
D NULL 110 1440 1440 60
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.